Перенос данных из устаревших конфигураций на платформе 1С:Предприятие 7.7 (например, «Торговля и Склад 7.7») в современные решения на 1С 8.3 (такие как «Бухгалтерия предприятия 3.0») часто сопряжен с трудностями из-за различий в типах данных. Одной из типичных проблем является перенос аналитики (субконто) со счетов затрат (например, 44.01). В 7.7 субконто может иметь тип ЗначениеСубконто, которое фактически выгружается как строка, в то время как в 8.3 субконто должно быть ссылкой на справочник СтатьиЗатрат.
Рассмотрим подробно, как решить эту задачу в рамках конфигурации «Конвертация данных 2.0», проанализируем необходимые обработчики и разберем примеры кода для корректной выгрузки и поиска объектов.
В конфигурации «Торговля и Склад 7.7» документ ПоступлениеПрочее может содержать услуги, где в качестве аналитики указано строковое наименование расхода. При стандартной выгрузке через КД 2.0, если для реквизита Субконто1 в табличной части не указано конкретное Правило Конвертации Объекта (ПКО), система выгружает его как простое текстовое значение. В «Бухгалтерии предприятия 3.0» механизм загрузки не понимает, что с этой строкой делать, и оставляет поле пустым, так как ожидает ссылку на объект.
Прежде всего, нам необходимо создать правило, по которому строка превратится в элемент справочника. Разберем пошагово:
СправочникСсылка.СтатьиЗатрат.Теперь обратимся к правилам конвертации свойств (ПКС) табличной части нашего документа (например, ПоступлениеТоваровУслуг). Нам нужно программно определить, когда выгружать субконто как номенклатуру, а когда — как статью затрат. Для этого используем обработчик «Перед выгрузкой» для свойства Субконто1.
Проанализируем пример кода для 7.7, который позволяет динамически менять правило конвертации:
// Проверяем вид субконто в источнике (7.7)
Если ОбъектКоллекции.Субконто1.Вид() <> "Номенклатура" Тогда
// Если это не номенклатура, значит считаем это статьей затрат (строкой)
// Подготавливаем данные для поиска по наименованию
Значение = СокрЛП(Строка(ОбъектКоллекции.Субконто1));
// Указываем имя нашего ПКО для Статей затрат
ИмяПКО = "СтатьиЗатрат";
// Если ПКО требует входящих данных для поиска
ПараметрыОбъекта = Значение;
Иначе
// Если это номенклатура, используем стандартное правило
Значение = ОбъектКоллекции.Субконто1;
ИмяПКО = "Номенклатура";
КонецЕсли;
// Для отладки можно вывести сообщение
// Сообщить("Выгружаем субконто: " + Значение + " по правилу: " + ИмяПКО);
Иногда простого присвоения значения недостаточно, если ПКО приемника ожидает структуру данных. В этом случае в 7.7 следует использовать СписокЗначений. Посмотрим на пример реализации:
Если ОбъектКоллекции.Субконто1.Вид() <> "Номенклатура" Тогда
// Создаем структуру данных для выгрузки
ДанныеДляСтатьи = СоздатьОбъект("СписокЗначений");
ДанныеДляСтатьи.Установить("Наименование", СокрЛП(Строка(ОбъектКоллекции.Субконто1)));
// Передаем список в качестве значения
Значение = ДанныеДляСтатьи;
ИмяПКО = "СтатьиЗатрат";
КонецЕсли;
Важный момент: В 7.7 строковые реквизиты могут содержать лишние пробелы в конце из-за фиксированной длины поля. Обязательно используйте функцию СокрЛП(), иначе в базе 8.3 создастся множество дублей статей затрат, которые визуально выглядят одинаково, но отличаются количеством пробелов.
Чтобы загрузка в 1С 8.3 прошла корректно, в созданном ПКО СтатьиЗатрат в обработчике «Поля поиска» можно добавить дополнительную логику, если стандартного поиска по наименованию недостаточно:
Если НомерВариантаПоиска = 1 Тогда
// Пытаемся найти статью по наименованию, переданному из 7.7
НаименованиеДляПоиска = СвойстваПоиска.Получить("Наименование");
СсылкаНаОбъект = Справочники.СтатьиЗатрат.НайтиПоНаименованию(НаименованиеДляПоиска, Истина);
// Если нашли - прекращаем поиск
Если Не СсылкаНаОбъект.Пустая() Тогда
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
В процессе работы вы можете столкнуться с тем, что отрицательные суммы в ПоступлениеТМЦ (возвраты или корректировки) должны превращаться не в обычное ПоступлениеТоваровУслуг, а в КорректировкаПоступления. Рассмотрим, как реализовать такое ветвление.
В обработчике «Перед выгрузкой» самого ПКО документа добавьте условие:
// Если сумма документа отрицательная, отменяем выгрузку по текущему ПКО
Если Источник.СуммаВзаиморасчетов < 0 Тогда
Отказ = 1;
// Здесь можно инициировать выгрузку по другому ПКО через ВыгрузитьПоПравилу
КонецЕсли;
Таким образом, для документов с разными знаками суммы будут применяться разные ПКО, что обеспечит чистоту данных в приемнике.
Проанализируем типичные ошибки, возникающие при такой конвертации:
ИмяПКО, которого не существует в файле правил, или допустили опечатку (например, СтатьяЗатрат вместо СтатьиЗатрат). Проверьте соответствие имен во вкладке ПКО.V77Exp.ert.Использование вышеописанных методов позволит вам гибко настраивать перенос сложной аналитики, превращая «плоские» строки старых систем в полноценные ссылочные данные современных конфигураций 1С.