Урок 20.
"Список значений и текстовый файл".

 

В выпуске №19 речь шла о закладках в форме. В тема не сложная и проблем с решением задач быть не  должно. Остановиться хотелось бы на одной задаче. 

Задача 4. В форме добавьте 7 флажков, названных днями недели. Форма должна работать просто: если флажок установлен, появляется соответствующая закладка, если флажок снят - закладка пропадает. Условие: закладки называются как дни недели. При этом они должны быть по порядку: "вторник" не может быть слева от "понедельника" - каждая закладка добавляется на свое место, а не справа.

Решений у этой задачи может быть несколько: от простых решений с перебором всех флажков, до "навороченных" процедур самостоятельно определяющих какой флажок установил пользователь. Решение считается правильным если 1. при добавлении новой закладки - не происходит смена текущей выбранной закладки. 2. Находясь в форме, в меню "Действие" Вы можете сделать сохранение текущей расстановки флажков - при открытии они будут установлены автоматически. Ваше решение правильное, если и закладки сами восстановятся.  Простые решения рассматривать не интересно. Одно из любопытных решений с комментариями Вы можете посмотреть здесь.

Сегодня рассмотрим еще одно применение списка значений. Многие, кто конфигурит 1С - ранее работали с БД в формате БДФ и по этому безмерно его любят и пренебрегают текстовыми файлами из-за неудобства работы. Знаю это на собственном опыте. Но после того, как я обнаружил способ с которым собираюсь Вас познакомить - я НИ РАЗУ после этого не работал с ДБФ, а всегда пользовался текстовыми файлами: и для обмена данными между базами, и для перехода на новый план счетов. С помощью текстовых файлов решается проблема переноса документов, справочников, остатков по счетам с аналитикой и без.

У списка значений есть один замечательный метод ВСтрокуСРазделителями(). Если этот метод применить к списку значений, то он вернет строку, содержащую значения из списка в кавычках, разделенные запятыми. Этим методом решается проблема формата текстового файла.  Метод ИзСтрокиСРазделителями() действует наоборот - из строки получается готовый список значений. 

Важно:  После того как вы преобразовали список значений в строку - все хранимые значений превратились в их тектовое предстаавление. Это означает, что если у Вас в списке значений был документ, то в результате работы метода  ВСтрокуСРазделителями() Вы получите строковое представление этого документа, а не сам документ. Обращаем Ваше внимание на то, что в в строку выгружаются только значения! Все представления теряются.

Теперь использую объект "Текст" вы сможете легко сформировать из строк текстовый файл и потом прочитать его. В самом простом примере это выгладит примерно так.

Выгрузка данных.

Процедура Сформировать() 
    Т=СоздатьОбъект("Текст");
    Сз=создатьОбъект("СписокЗначений");
    спр=создатьОбъект("Справочник.Контрагенты");
    Спр.ВыбратьЭлементы();
    пока спр.ПолучитьЭлемент()=1 цикл
        Если спр.ЭтоГруппа()=1 тогда///не будем пока с группами связываться.
            продолжить;
        конецЕсли;
        сз.УдалитьВсе();///каждый список - новый элемент
        сз.ДобавитьЗначение(спр.Код);//добавляем необходимые реквизиты.
        сз.ДобавитьЗначение(спр.Наименование);
        сз.ДобавитьЗначение(спр.ПолнНаименование);
        сз.ДобавитьЗначение(спр.ВидКонтрагента);
        стр=сз.ВСтрокуСРазделителями(); 
        Т.Добавитьстроку(стр);
    конецЦикла;
    т.Записать(КаталогИБ()+"выгрузка.txt");
КонецПроцедуры

Загрузка данных:

Процедура Загрузка()
    т=создатьОбъект("Текст");//из этого текста будем доставать значения
    сз=создатьОбъект("СписокЗначений");// в этот список будет конвертировать из строки
    т.Открыть(КаталогИБ()+"выгрузка.txt");//открываем файл
    Для к=1 по т.КоличествоСтрок() цикл// бежим по тексту
        стр=т.ПолучитьСтроку(к);
        сз.ИзСтрокиСРазделителями(стр);//получили список значений
        код=сз.ПолучитьЗначение(1); //из соответствующей позиции получаем, соответствующие реквизиты
        Наименование=сз.ПолучитьЗначение(2); 
        ПолнНаименование=сз.ПолучитьЗначение(3); 
        ВидК=сз.ПолучитьЗначение(4);///вид контрагента - должно быть перечисление 
        Если ВидК="Прочая организация" тогда
            видК=Перечисление.ВидыКонтрагентов.Организация;
        иначеесли ВидК="Физ. лицо" тогда
            видК=Перечисление.ВидыКонтрагентов.ЧастноеЛицо;
        иначеесли ВидК="Дочернее общество" тогда
            видК=Перечисление.ВидыКонтрагентов.Дочернееобщество;
        иначеЕсли ВидК="Зависимое Общество" тогда
            видК=Перечисление.ВидыКонтрагентов.ЗависимоеОбщество;
        иначе 
            видК="";
        КонецЕсли; 
        /////////
        //////// здесь требуется дописать кусок для генерации новых элементов в справочнике
        ////////
    конецЦикла;
конецПроцедуры

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

На самом деле выгрузка и загрузка осуществляется не так просто. Если Вы выгружаете многоуровневый справочник, то надо кроме самого элемента выгружать информацию о его родителе (чтобы найти его в конфигурации-приемнике), признак группа/элемент, может быт понадобится номер уровня. 

Благодаря тому, что каждая новая строка в тексте может быть отлична от предыдущей - Вы сможете выгружать документы с шапками и табличными частями. В ДБФ это было не так легко.  Самое трудное - это корректная загрузка информации. По опыту могу сказать, что написание процедуры хорошей загрузки  занимает 80% времени от всей процедуры выгрузки/загрузки. 

Задача для самостоятельной работы: Учитесь выгружать и загружать данные начиная с простых случаев и заканчивая сложными
1. справочник одноуровневый
2. Справочник многоуровневый с уникальностью кодов / без уникальности кодов.
3. Справочники с периодическими реквизитами с переносом всех значений периодических реквизитов.
4. Подчиненные справочники
5. Документы без табличной части
6. Документы с табличной частью.

Hosted by uCoz