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