Перенос данных из устаревших конфигураций на платформе 1С:Предприятие 7.7 в современные решения на платформе 1С:Предприятие 8.x — задача, с которой до сих пор часто сталкиваются разработчики. Одним из наиболее гибких инструментов для этого является конфигурация «Конвертация данных 2.1» (КД 2). Однако из-за различий в архитектуре платформ при попытке программно настроить заполнение табличных частей документов могут возникать неочевидные ошибки.
В этой статье мы подробно разберем, почему возникает популярная ошибка выгрузки на стороне 1С 7.7, почему обработчик При загрузке не подходит для заполнения строк и как правильно реализовать заполнение табличной части на стороне приемника (в 1С 8) с использованием предопределенных данных и перечислений.
При настройке правил выгрузки группы свойств (ПКГС) для табличной части разработчики часто устанавливают флаг «Получить из входящих данных». Если при этом на стороне источника (в 1С 7.7) не была программно инициализирована и передана таблица значений, обработка выгрузки V77Exp.ert аварийно завершает свою работу в функции ВыгрузитьГруппуСвойств с сообщением «Ошибка выбора объектов коллекции».
Это происходит потому, что выгрузчик пытается прочитать коллекцию объектов из пустого источника. Чтобы решить эту проблему, нам нужно определиться с архитектурным подходом: где именно должна формироваться табличная часть — на стороне источника (1С 7.7) или на стороне приемника (1С 8)? Рассмотрим оба решения.
Этот вариант идеален, если вся необходимая информация для заполнения строк уже есть в реквизитах шапки загружаемого документа или если строки должны заполняться по фиксированному алгоритму (например, подстановка предопределенных счетов учета или перечислений 1С 8, которых физически нет в 1С 7.7).
Проанализируем типичную ошибку: попытку использовать обработчик «При загрузке» в Правилах конвертации объектов (ПКО). Этот обработчик выполняется в самом начале процесса загрузки объекта из XML-файла. В этот момент XML-парсер еще не сопоставил и не перенес значения реквизитов шапки из файла в создаваемый объект 1С 8. Соответственно, обратиться к реквизитам шапки (например, организации, дате, валюте) для заполнения строк табличной части невозможно — они будут пустыми.
Для решения этой задачи мы должны использовать обработчик «После загрузки» ПКО. На данном этапе объект в базе-приемнике уже полностью наполнен данными из файла конвертации, но еще не записан в базу данных. Мы можем свободно использовать любые реквизиты шапки и программно манипулировать табличной частью.
Разберем по шагам, как это настроить в «Конвертации данных 2.1»:
Посмотрим на пример кода в обработчике «После загрузки»:
// Очищаем табличную часть, если туда могли попасть нежелательные данные
Объект.ТаблЧасть.Очистить();
// Добавляем новую строку в табличную часть документа
НоваяСтрока = Объект.ТаблЧасть.Добавить();
// Заполняем реквизиты строки константами или на основе реквизитов шапки
НоваяСтрока.Реквизит1 = 1;
НоваяСтрока.Реквизит2 = 2;
// Пример использования реквизита шапки загруженного документа
НоваяСтрока.ОтражениеВУчете = Объект.Организация;
// Заполнение предопределенным элементом справочника
НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.НДС20;
// Заполнение значением перечисления
НоваяСтрока.СтатусСтроки = Перечисления.СтатусыДокументов.Проведен;
// Заполнение предопределенным счетом учета
НоваяСтрока.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
Если данные для табличной части должны формироваться на основе сложной логики в 1С 7.7, нам необходимо передать готовую коллекцию через файл обмена. Чтобы избежать ошибки выгрузки, мы должны правильно объявить коллекцию.
Разберем алгоритм действий:
// Создаем таблицу значений, которая будет выступать в роли коллекции
КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
КоллекцияОбъектов.НоваяКолонка("Реквизит1");
КоллекцияОбъектов.НоваяКолонка("Реквизит2");
КоллекцияОбъектов.НоваяКолонка("Реквизит3");
// Заполняем коллекцию данными из выборки 7.7
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Реквизит1 = 1;
КоллекцияОбъектов.Реквизит2 = 2;
КоллекцияОбъектов.Реквизит3 = 3;
При такой настройке выгрузчик 1С 7.7 корректно преобразует созданную таблицу значений в структуру XML, и при загрузке в 1С 8 табличная часть заполнится автоматически штатными механизмами КД 2.
Важный нюанс: Что делать, если в этой табличной части один из реквизитов должен быть заполнен предопределенным элементом приемника, которого нет в 7.7? Для этого в правилах конвертации свойств (ПКС) внутри этой группы свойств для нужного реквизита в обработчике «Перед выгрузкой» укажите специальный параметр Выражение:
// Передаем выражение, которое будет вычислено на стороне 1С 8 при загрузке
Выражение = "ПредопределенноеЗначение(""ПланыСчетов.Хозрасчетный.ТоварыНаСкладах"")";
Если вам нужны эталонные примеры настройки правил выгрузки (например, для документа «Приходный кассовый ордер» или других объектов), не обязательно искать их на сторонних ресурсах. Фирма «1С» поставляет готовые файлы правил в комплекте с шаблонами обновлений конфигурации «Бухгалтерия предприятия» (ред. 3.0).
Рассмотрим, где они хранятся на вашем компьютере. Перейдите по пути установки шаблонов конфигураций (обычно это папка AppData пользователя):
...\1c\Accounting\<Номер_Вашей_Текущей_Версии_БП>\Convert\
В этом каталоге вы найдете несколько важных XML-файлов:
Вы можете загрузить любой из этих файлов в свою базу «Конвертация данных 2.1» через меню «Загрузка правил обмена». Проанализировав эти типовые правила, вы увидите, как разработчики фирмы «1С» решают задачи заполнения субконто, счетов учета, работы с перечислениями и динамического формирования строк документов при переходе со старых платформ.