Переход с платформы 1С:Предприятие 7.7 на современные конфигурации 1С 8.3 нередко вызывает трудности на этапе переноса остатков. В отличие от справочников, остатки не хранятся в виде готовых документов в источнике, а собираются программно с помощью бухгалтерских итогов и загружаются в документы ВводНачальныхОстатков в приемнике. Разберем по шагам, как правильно настроить правила конвертации данных (КД 2.1), собрать остатки на стороне 7.7, передать табличную часть и корректно провести документ в 8.3.
Для выгрузки остатков создадим правило выгрузки данных (ПВД) со способом выгрузки Произвольный алгоритм. В обработчике «Перед обработкой» выполним запрос к итогам 1С 7.7 и соберем данные в таблицу значений.
Рассмотрим пример формирования остатков по счету 41.1 в разрезе номенклатуры и мест хранения:
ДатаВводаОстатков = Дата(2016, 12, 31);
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("СчетУчета");
ТЗ.НоваяКолонка("Склад");
ТЗ.НоваяКолонка("Номенклатура");
ТЗ.НоваяКолонка("Количество");
ТЗ.НоваяКолонка("Сумма");
Счет = СчетПоКоду("41.1");
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
БИ.ИспользоватьСубконто(ВидыСубконто.Номенклатура,, 1);
БИ.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);
БИ.ВыполнитьЗапрос(ДатаОкончания, ДатаОкончания, Счет);
БИ.ВыбратьСубконто(ВидыСубконто.Номенклатура);
Пока БИ.ПолучитьСубконто(ВидыСубконто.Номенклатура) = 1 Цикл
БИ.ВыбратьСубконто(ВидыСубконто.МестаХранения);
Пока БИ.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.СчетУчета = БИ.Счет;
ТЗ.Склад = БИ.Субконто(ВидыСубконто.МестаХранения);
ТЗ.Номенклатура = БИ.Субконто(ВидыСубконто.Номенклатура);
ТЗ.Количество = БИ.СКД("К");
ТЗ.Сумма = БИ.СКД("С");
КонецЦикла;
КонецЦикла;
// Упаковываем реквизиты документа и ТЧ в СписокЗначений
СтруктураДокумента = СоздатьОбъект("СписокЗначений");
СтруктураДокумента.ДобавитьЗначение(ДатаВводаОстатков, "Дата");
СтруктураДокумента.ДобавитьЗначение(ТЗ, "ТоварыНаСкладе");
// Передаем структуру в качестве входящих данных
ВыгрузитьПоПравилу(, , СтруктураДокумента, , "ВводНачальныхОстатков41");
Распространенная ошибка при работе с КД 2.1 и источником на платформе 7.7 — изменение только XML-файла правил. В платформе 7.7 весь исполняемый код обработчиков не компилируется «на лету» из XML, а должен быть жестко внедрен в модуль обработки выгрузки.
Проанализируем обязательный порядок действий:
v77exp.ert.v77exp.ert. Только после этого запускаем процедуру выгрузки.Создадим правило конвертации объектов (ПКО) ВводНачальныхОстатков41, где объект-источник оставляем пустым, а объектом-приемником выбираем ДокументСсылка.ВводНачальныхОстатков.
Разберем настройку передачи табличной части и реквизитов шапки:
Дата, Организация, РазделУчета создаем ПКС. Если значение передается через структуру входящих данных, устанавливаем флаг «Получить из входящих данных». Для фиксированных значений можно задать код в обработчике «Перед выгрузкой» (например, Значение = "Товары"; для раздела учета).ОтражатьВБухгалтерскомУчете), в обработчике ПКС «Перед выгрузкой» указываем числовое значение:
Значение = 1;
Значение = ОбъектКоллекции.Номенклатура;
Либо, если имена колонок в ТЗ совпадают с именами реквизитов приемника, в обработчике ПКГС «Перед выгрузкой» достаточно указать:
КоллекцияОбъектов = ВходящиеДанные.ТоварыНаСкладе;
Если в загруженном документе номенклатура и склады остаются пустыми, выясним причину: в типовых конфигурациях 1С 8.3 отображение субконто в форме ввода остатков зависит от заполненности реквизита СчетУчета. Если счет не заполнен, аналитика скрывается.
Для корректной передачи счета создаем отдельное ПКО для плана счетов (например, Хозрасчетный) и указываем его в ПКС счета учета табличной части. Чтобы загрузка не затирала существующие наименования и коды предопределенных счетов в базе 8.3, обязательно установим флаг «Не замещать существующие объекты в приемнике при загрузке» в настройках ПКО плана счетов или пропишем в обработчике «Перед загрузкой»:
НеЗамещатьОбъектПриЗагрузке = Истина;
В 1С 7.7 дата не содержит времени (выгружается 00:00:00). Для корректного закрытия периода остатки должны лечь на последнюю секунду дня — 23:59:59, иначе обороты за 31 декабря исказят сальдо. Кроме того, документ должен быть проведен с формированием проводок.
В ПКО документа ВводНачальныхОстатков в обработчике «Перед загрузкой» на стороне 1С 8.3 пропишем:
// Сдвигаем время документа на конец дня
Объект.Дата = КонецДня(Объект.Дата);
// Устанавливаем режим автоматического проведения
РежимЗаписи = "Проведение";
Если требуется выгрузить остатки по валютным счетам (например, расчеты с поставщиками или авансы), стандартной функции СКД("С") недостаточно. Посмотрим, как модифицировать запрос БухгалтерскиеИтоги в 1С 7.7:
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
// Включаем валютный учет в запросе
БИ.ИспользоватьВалюту(,, 1);
БИ.ВыполнитьЗапрос(ДатаОкончания, ДатаОкончания, Счет);
Пока БИ.ПолучитьСубконто() = 1 Цикл
ТЗ.НоваяСтрока();
ТЗ.Валюта = БИ.Валюта;
ТЗ.СуммаВал = БИ.ВалСКД(); // или БИ.СКД("В")
ТЗ.СуммаРуб = БИ.СКД("С"); // рублевый эквивалент
КонецЦикла;
Если настройка сложных правил в КД 2.1 вызывает трудности или объем остатков невелик, можно воспользоваться альтернативными решениями:
COMОбъект("V77.Application"). Обработка считывает итоги и сразу создает проведенные документы в базе 8.3 без генерации промежуточных XML-файлов.