Как исправить дублирование услуг в табличных частях при выгрузке из «1С:Торговля + Склад 9.2» в «1С:Бухгалтерия предприятия 2.0»?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Перенос данных между конфигурациями разных поколений платформы 1С — задача, с которой регулярно сталкиваются специалисты. Одним из классических и до сих пор актуальных направлений является обмен между «1С:Торговля + Склад 9.2» (на платформе 7.7) и «1С:Бухгалтерия предприятия 2.0» (на платформе 8.2). В процессе такой выгрузки могут возникать специфические ошибки, связанные с различием в архитектуре метаданных двух систем.

В этой статье мы подробно разберем распространенную проблему: почему при выгрузке документов реализации услуги начинают дублироваться, попадая одновременно и в табличную часть «Товары», и в табличную часть «Услуги» в приемнике. Мы проанализируем причины этой ошибки и рассмотрим несколько эффективных способов ее решения.

В чем техническая суть проблемы?

Для того чтобы понять природу ошибки, обратимся к структуре хранения данных в сопоставляемых конфигурациях:

  1. В конфигурации «1С:Торговля и Склад 7.7» документ Реализация содержит одну единую табличную часть. В нее записываются абсолютно все номенклатурные позиции — и физические товары, и нематериальные услуги.
  2. В конфигурации «1С:Бухгалтерия предприятия 8» документ Реализация товаров и услуг спроектирован иначе: в нем присутствуют две независимые табличные части — Товары и Услуги.

При обмене данными с помощью правил, созданных в «1С:Конвертация данных 2», разделение одной табличной части источника на две табличные части приемника происходит с помощью правил конвертации группы свойств (ПКГС). Настраиваются две группы свойств:

В обработчике события Перед выгрузкой для каждой строки коллекции (строки исходного документа) выполняется логическая проверка типа номенклатуры. Алгоритм выглядит следующим образом:

Если в базе-источнике по каким-то причинам тип номенклатуры определяется неверно или возвращает пустое значение, проверка в обоих обработчиках не срабатывает должным образом. В результате одна и та же строка успешно записывается и в ТЧ «Товары», и в ТЧ «Услуги» документа в «1С:Бухгалтерии».

Выясняем причины сбоя

Почему же в старых документах «1С:ТиС 7.7» тип номенклатуры может определяться некорректно? Выделим две основные причины:

  1. Обновление релизов конфигурации. Если информационная база долгое время работала на старом релизе (например, 948), а затем была обновлена до актуального (например, 997), механизмы проведения и заполнения реквизитов могли измениться. В старых документах структура данных в табличной части осталась прежней, что мешает новым правилам обмена корректно прочитать свойства объектов.
  2. Оптимизация и скрытые реквизиты строк. Для ускорения работы партионного учета и проведения документов в «1С:ТиС 7.7» некоторые свойства номенклатуры (такие как вид номенклатуры или тип налога) дублируются непосредственно в скрытых реквизитах строк табличной части документа при его записи или проведении. Если пользователь изменил вид номенклатуры в карточке справочника «задним числом», в уже проведенных ранее документах эти скрытые реквизиты остались старыми.

Разберем по шагам три практических метода решения этой проблемы.

Решение 1. Групповое перепроведение документов в источнике

Самый простой и быстрый способ, если учетный период в «1С:Торговля + Склад 7.7» еще не закрыт окончательно и перепроведение документов не вызовет сдвига партионного учета или изменения себестоимости.

При перепроведении документа 1С 7.7 принудительно инициализирует процедуру записи строки и заново обращается к актуальным реквизитам справочника Номенклатура. Скрытые и служебные реквизиты табличной части перезаписываются новыми, корректными значениями.

Для этого воспользуемся стандартной обработкой:

  1. Откроем базу «1С:Торговля + Склад 7.7» в режиме предприятия.
  2. Перейдем в меню Сервис — Обработка документов (или воспользуемся групповым проведением документов).
  3. Выберем период, за который документы выгружаются некорректно.
  4. Установим фильтр по виду документа Реализация.
  5. Запустим процесс выполнения. После успешного перепроведения выполним повторную выгрузку.

Решение 2. Корректировка правил обмена в «Конвертации данных»

Если перепроведение документов в источнике строго запрещено (например, за прошлые закрытые налоговые периоды), нам необходимо настроить правила обмена так, чтобы они игнорировали устаревшие реквизиты строк документов и всегда обращались напрямую к актуальным данным справочника.

Проанализируем ситуацию. В типовых правилах проверка в ПКГС часто пишется следующим образом:


// Пример проблемного кода в обработчике "Перед выгрузкой" ПКГС "Товары"
Если ОбъектКоллекции.ТипНоменклатуры = Перечисление.ТипыНоменклатуры.Услуга Тогда
    Отказ = Истина;
КонецЕсли;

Здесь ОбъектКоллекции.ТипНоменклатуры обращается к значению реквизита строки документа. Если в базе-источнике этот реквизит пуст или хранит неверное значение, условие не выполняется.

Нам необходимо изменить обращение, заставив систему обращаться непосредственно к реквизиту элемента справочника номенклатуры:


// Исправленный и надежный вариант кода в ПКГС "Товары"
Если ОбъектКоллекции.Номенклатура.ВидНоменклатуры = ПолучитьПустоеЗначение("Справочник.ВидыНоменклатуры") Тогда
    // Если вид номенклатуры не определен в справочнике
    Отказ = Истина;
ИначеЕсли СокрЛП(ОбъектКоллекции.Номенклатура.ВидНоменклатуры.Наименование) = "Услуга" Тогда
    // Если это услуга - отменяем выгрузку строки в ТЧ "Товары"
    Отказ = Истина;
КонецЕсли;

Соответственно, для ПКГС Услуги код будет зеркальным:


// Исправленный вариант кода в ПКГС "Услуги"
Если СокрЛП(ОбъектКоллекции.Номенклатура.ВидНоменклатуры.Наименование) <> "Услуга" Тогда
    // Если это НЕ услуга (товар, тара, работа) - отменяем выгрузку в ТЧ "Услуги"
    Отказ = Истина;
КонецЕсли;

Такой подход гарантирует получение точной информации из карточки номенклатуры на момент выгрузки, независимо от даты создания или проведения документа.

Решение 3. Групповое исправление реквизитов без перепроведения документов

Рассмотрим промежуточный вариант. Что делать, если правила обмена менять не хочется (или нет возможности загрузить их в КД), а перепроводить документы нельзя из-за риска сдвига партионных последовательностей? Мы можем обновить скрытые реквизиты программно, без вызова процедур проведения.

Для этого можно написать или запустить простую внешнюю обработку в 1С 7.7. Напишем пример кода, который обновит реквизиты табличной части:


// Пример программного обновления реквизитов табличной части без проведения
Процедура ОбновитьРеквизитыРеализаций()
    Док = СоздатьОбъект("Документ.Реализация");
    Док.ВыбратьДокументы(ВыбНачДата, ВыбКонДата);
    Пока Док.ПолучитьДокумент() = 1 Цикл
        Если Док.Проведен() = 1 Тогда
            Док.АвтоВремяОтключить(); // Чтобы не сдвигать время документа
            Модифицирован = 0;
            
            Док.ВыбратьСтроки();
            Пока Док.ПолучитьСтроку() = 1 Цикл
                // Проверяем соответствие реквизита строки значению в справочнике
                Если Док.ТипНоменклатуры <> Док.Номенклатура.ТипНоменклатуры Тогда
                    Док.ТипНоменклатуры = Док.Номенклатура.ТипНоменклатуры;
                    Модифицирован = 1;
                КонецЕсли;
            КонецЦикла;
            
            Если Модифицирован = 1 Тогда
                Док.Записать(); // Записываем документ без проведения и проводок
                Сообщить("Обновлен документ: " + Док.ТекущийДокумент());
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот метод абсолютно безопасен для бухгалтерских итогов и партионного учета в «1С:Торговля + Склад 7.7», так как мы используем метод Записать(), который не изменяет движения регистров и сохраняет текущий статус проведения документа.

Рекомендация: тестирование и исправление базы

Перед выполнением любых массовых манипуляций с базой данных (перепроведение, программная перезапись или выгрузка) настоятельно рекомендуется провести тестирование и исправление (ТиИ) физической структуры базы данных. Для этого в режиме Конфигуратора 1С 7.7 перейдите в меню Администрирование — Тестирование и исправление ИБ. Убедитесь, что включены опции проверки ссылочной целостности базы, чтобы исключить наличие «битых» или несуществующих ссылок на номенклатуру в табличных частях документов.

← На главную