Как выгрузить только номенклатуру с остатками при переходе с 1С 7.7 на 1С 8

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

Перенос данных из устаревших систем 1С 7.7 в современные конфигурации на платформе 1С 8.3 — это задача, с которой сталкивается практически каждый разработчик. Одной из главных проблем при таком переезде является "раздутый" справочник Номенклатура. За годы работы в базе скапливаются тысячи позиций, которые более не используются, и переносить их все — значит засорять новую базу ненужной информацией. Наша цель — выгрузить только те позиции, по которым на текущий момент есть реальный остаток на складах.

В этой статье мы разберем несколько эффективных способов решения этой задачи с помощью механизма "Конвертация данных 2.1", проанализируем программные методы и хитрости настройки правил выгрузки.

Способ 1. Использование произвольного алгоритма в ПВД

Это самый гибкий и профессиональный метод. Вместо того чтобы полагаться на стандартную выборку всех объектов справочника, мы сами напишем запрос к регистрам 1С 7.7 и передадим результат в правила конвертации. Рассмотрим этот процесс по шагам.

Во-первых, нам необходимо настроить Правило выгрузки данных (ПВД). В настройках ПВД для номенклатуры выберем способ выборки "Произвольный алгоритм". Это позволит нам полностью контролировать процесс сбора данных перед их отправкой. В обработчике "Перед выгрузкой данных" мы напишем текст запроса.

Проанализируем пример кода для получения остатков в 1С 7.7:


ТекстЗапроса = "
|Период с РабочаяДата() по РабочаяДата();
|Склад = Регистр.ОстаткиТоваров.Склад;
|Товар = Регистр.ОстаткиТоваров.Товар;
|Количество = Регистр.ОстаткиТоваров.ОстатокТовара;
|Функция Остаток = КонОст(Количество);
|Группировка Товар без групп;
|Условие (Количество > 0);
|";

Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
    Пока Запрос.Группировка(1) = 1 Цикл
        // Выгружаем только найденный товар по существующему ПКО
        ВыгрузитьПоПравилу(Запрос.Товар, , , , "Номенклатура");
    КонецЦикла;
КонецЕсли;

В данном примере мы используем функцию ВыгрузитьПоПравилу. Разберем подробнее её параметры: первым передается сам объект (ссылка на товар из запроса), а последним — имя Правила конвертации объектов (ПКО), которое должно быть использовано. Это позволяет нам не ломать существующую логику ПКО, а просто ограничить входной поток данных.

Способ 2. Выгрузка по ссылкам через технический документ

Если вы не хотите погружаться в написание сложных запросов на языке 7.7, можно воспользоваться логикой работы самой "Конвертации данных". Механизм обмена устроен так, что если выгружается документ, то все объекты, на которые он ссылается (номенклатура, контрагенты, склады), выгружаются автоматически.

Рассмотрим алгоритм действий:

  1. В исходной базе 1С 7.7 создадим новый документ Инвентаризация или ОстаткиТМЦ (в зависимости от конфигурации).
  2. Воспользуемся стандартной кнопкой "Заполнить по остаткам на складах". В табличную часть попадет только та номенклатура, которая имеет ненулевой остаток.
  3. В обработке выгрузки выберем для переноса только этот конкретный документ.
  4. В правилах конвертации (ПКО) для Номенклатуры убедимся, что настроены все необходимые свойства.

Преимущество метода: Мы гарантированно получаем актуальный список номенклатуры, и нам не нужно заботиться о написании кода. Номенклатура "поедет" за документом по ссылкам. После загрузки в 1С 8 этот документ можно просто удалить или использовать как основу для ввода начальных остатков.

Важные нюансы при программной выгрузке

При использовании Способа 1 (произвольный алгоритм) часто возникает вопрос: как сохранить иерархию (папки) справочника? Если мы просто выгружаем элементы запросом, они могут попасть в корень справочника в базе-приемнике. Чтобы этого избежать, проанализируем настройку ПКО Номенклатура.

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

Также стоит обратить внимание на производительность. В 1С 7.7 запросы к регистрам могут выполняться долго, если база имеет большой объем. Чтобы ускорить процесс, мы можем сначала выгрузить результат запроса в Таблицу Значений, свернуть её по номенклатуре (если остатки велись в разрезе складов) и уже затем в цикле запускать выгрузку.

Использование "Входящих данных" для передачи остатков

Иногда нам нужно не просто создать карточку товара, но и сразу передать значение остатка, чтобы, например, заполнить табличную часть документа в 1С 8. В этом случае функция ВыгрузитьПоПравилу дополняется параметром ВходящиеДанные.

Посмотрим на пример передачи данных:


ПараметрыОбъекта = СоздатьОбъект("СписокЗначений");
ПараметрыОбъекта.Установить("КоличествоОстаток", Запрос.Остаток);
ВыгрузитьПоПравилу(Запрос.Товар, , , ПараметрыОбъекта, "Номенклатура");

В базе-приемнике, в ПКО номенклатуры или в правилах конвертации свойств документа, мы сможем обратиться к этому значению через структуру ВходящиеДанные.КоличествоОстаток. Это избавляет от необходимости делать повторные запросы при загрузке.

Оптимизация стандартного переноса (Способ 3)

Существует еще один "ленивый", но действенный метод. Если вы используете типовой переход, подготовленный фирмой 1С, вы можете управлять процессом через флаги выгрузки. В обработке выгрузки часто есть настройки "Переносить остатки" и "Переносить справочники".

Выясним причину, почему иногда стоит отключить перенос справочника Номенклатура как самостоятельного объекта, но оставить включенным перенос остатков. В этом случае система проигнорирует пустые позиции справочника и создаст в приемнике только те объекты, которые фигурируют в движениях по остаткам. Это самый простой способ отсечь "мусор" без написания кода, однако он требует тщательной проверки настроек ПВД.

Резюме

Подведем итоги нашего анализа. Для чистого и быстрого переноса данных из 7.7 в 8 рекомендуется использовать комбинированный подход:

Применяя эти методы, мы добьемся того, что в новой информационной системе 1С 8 будет содержаться только актуальная, рабочая номенклатура, что значительно облегчит работу пользователей и повысит производительность базы данных.

← На главную