23.11.2016

1С свернуть массив

Как же свернуть массив по различным значениям? А никак, только перебором. Можно конечно запариться перегнать массив в таблицу свернуть таблицу и выгрузить колонку, но зачем? Надо бы конечно провести эксперимент, какой способ быстрее, но крайне лень.
Поэтому вот проверенный вариант в лоб:

Функция СвернутьМассив(ИсхМассив) 
НовМассив = новый Массив;
Для Каждого ТекЭлемент из ИсхМассив Цикл
Если НовМассив.найти(ТекЭлемент) = Неопределено Тогда
НовМассив.добавить(ТекЭлемент);   
КонецЕсли;
КонецЦикла;   
Возврат НовМассив;
КонецФункции

Суть в том, что берем массив с дублями, делаем пустой массив и добавляем в новый массив элементы, которые еще не успели перенести. Все!

1С проверить поле в структуре

Здравствуйте, задача тривиальная, порой бывает удобно воспользоваться структурой. И порой в связи с этим всплывают какие-нибудь неожиданные косяки, связанные с неудачным заполнением. Чтобы исключить неудачное заполнение можно пользоваться терпением при заполнении. Или можно при обращении к полям структуры устроить проверку на наличие этих полей. Сделать это можно с помощью метода структуры Свойство.

10.11.2016

1с Отбор по периоду в списке управляемых форм

Для динамического списка в управляемых формах есть, конечно, специально Отбор через точку, примерно ДинамическийСписок1.Отбор, в котором можно установить все необходимые параметры, включая период. Но, при редактировании на форме, у нас будут две кнопки:
Отбор, который доступен через ДинамическийСписок1.Отбор, будет при ручном редактировании отображаться при нажатии "Настроить список", но в установке периода, этого отбора видно не будет. Катострофа! Ведь пользователь, если ему вдруг не понравиться период, установленный автоматом, полезет же в "Установить период" и запутается окончательно, ничего там не найдя.
Однако ж, есть решение. И довольно простое. В процедуру формы списка ПриОткрытии вставляем следующий код:
лНовыйПериод = Новый СтандартныйПериод(НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()+24*60*60));
ЗаполнитьЗначенияСвойств(Элементы.Список.Период, лНовыйПериод);
Элементы.Список.Обновить();
Здесь мы через элементы формы обращаемся к установке периода, для примера период ставится текущая и завтрашняя даты. И все. Выбранный период будет виден через кнопку "Установить период".

22.09.2016

1С чтение xml с помощью XDTO

Чтобы разобрать файл xml можно воспользоваться объектом ФабрикаXDTO. Хоть он и кажется чем-то непонятным и странным, однако ж на деле этот вариант гораздо проще и быстрее, чем возиться с ЧтениеXML и разбирать потом его с помощью поисков по строке.
Итак, для начала немного теории, совсем чуть-чуть, буквально 2 предложения. XDTO - это такой 1с-ный ответ SOAP-пакетам, импортозамещающий элемент из нормального программирования. И один из вариантов использования заключается в возможности обращаться с конкретными xml-файлами как с объектами, у которых есть поля и свойства, и которые можно записывать(при небольшой оговорке) и считывать.
Допустим у нас есть простейший xml-файл:
<?xml version="1.0" encoding="utf-8"?>
<ROOT>
    <PricesList>

        <PriceList CODE="КЗ000005152" PRICE="88.64406"/>
        <PriceList CODE="КЗ000005153" PRICE="61.52542"/>
    </PricesList>
</ROOT>

Т.е. тут у нас список прайслистов в объекте PricesList, где каждый отдельный прайслист содержит два свойства: код и цену.
Следующий листинг поможет разобрать xml:

лЧтение = Новый ЧтениеXML;
лЧтение.ОткрытьФайл(лФайл.ПолноеИмя);//лФайл - это файл xml
лФабрика = Новый ФабрикаXDTO;
лОбъектXDTO = лФабрика.ПрочитатьXML(лЧтение);
Для Каждого PriceList Из лОбъектXDTO.PricesList.PriceList Цикл
лКодПрайсЛиста = PriceList.CODE;
лЦена = PriceList.PRICE;
КонецЦикла;
Ну тут и комментарии, думаю, излишни, и так все ясно.

30.08.2016

1С заполнить подвал таблицы значений

И так, у меня тут не слишком сложные вопросы освещаются(но зато крайне полезные:)), и этот будет одним из самых несложных. "Как же заполнить подвал таблицы значений?!" - вопиете вы в пустоту интернета. А очень просто, дети мои. Буквально в два клика.
Первый клик, нужно осуществить в свойствах таблицы на галочке "Подвал":
Второй в свойствах интересующей нас колонки таблицы:
И все! Только, конечно, надо учесть, что тип у выбранной колонки должен быть числовым, строки, даты и ссылки 1с складывать отказывается.


27.03.2016

1с 8 Выгрузка в dbf

Чтобы написать выгрузку в dbf-формат нам потребуется объект XBase. А также придется заранее определить типы колонок нашей будущей таблицы.
Итак, ниже листинг определения полей таблицы дбф.
лИмяФайла = "C:\1.dbf";
дбф = Новый XBASE;
дбф.Кодировка = КодировкаXBase.ANSI;
дбф.поля.Добавить("Merch_ID","N",11);
дбф.поля.Добавить("Merch_Name","S",200);
дбф.поля.Добавить("Date","D");
дбф.поля.Добавить("Ol_Code","S",25);
дбф.поля.Добавить("Vat","N",5,2);дбф.поля.Добавить("Sum","N",15,2);
дбф.СоздатьФайл(лИмяФайла); 
Потому что, чтобы начать заполнять дбф-файл его вначале нужно создать. И, конечно, тут есть нюанс. Не знаю кто конкретно повинен в этом, но название файла-дбф не должно превышать 8 символов. Если символов будет больше, 1с выдаст ошибку создания файла. Вроде бы что такого, но это очень огорчает, когда создаешь таблицу в сетевой папке с длинными названиями серверов.
N,D и S - это описание типов числовой, дата и строковый, соответственно. Расписывать не буду, лучше посмотреть в синтаксис-помощнике(Ctrl+F1).
Теперь, когда файл создан, его можно открыть и начать заполнять: 
дбф.ОткрытьФайл(лИмяФайла);  
дбф.Добавить();  
дбф.Merch_ID = "01";  
дбф.Merch_Name = "Пупышкин Василий";  
дбф.Date = ТекущаяДата();  
дбф.Ol_Code = "01";  
дбф.Vat = 18.0;
дбф.Sum = 158.82;  
дбф.Записать();
дбф.ЗакрытьФайл();
Вот и все, теперь на диске C у нас будет лежать дбф-файл, с одной строкой.

15.03.2016

1C 8.2 поместить файлы в архив

Начиная с 8-ой версии 1с есть возможность использовать внутренние средства 1с для архивирования файлов. До этого приходилось прибегать к использованию внешних программ, наподобие winrar или 7zip  и процедуры ЗапуститьПриложение. В принципе, и сейчас никто не мешает этим пользоваться, но если есть вариант без внешних приложений, то лучше пользоваться им.
Все очень просто, настолько просто, что я не буду даже вставлять кнопку "Читать дальше", потому что дальше ничего нет.
Пишем функцию:
Функция ПоместитьФайлыВАрхив(мсФайлы)
лИмяАрхива = лКаталогВыгрузки+"1.rar";
лЗаписьZIP = Новый ЗаписьZipФайла(лИмяАрхива);
Для Каждого лФайл Из мсФайлы Цикл
лЗаписьZIP.Добавить(лФайл.ПолноеИмя);
КонецЦикла;
лЗаписьZIP.Записать();
Возврат лИмяАрхива;
КонецФункции
Итак, берем массив файлов, проходим его добавляя в переменную записи zip-файла и все. Несмотря на то что конструктор называется ЗаписьZipФайла он вполне в состоянии записывать "rar" архивы. Вот и все.