Как загрузить несколько типов цен в один документ «Установка цен номенклатуры» в 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

Приветствуем вас! В процессе автоматизации торгового учета часто возникает необходимость массовой загрузки прайс-листов от поставщиков или обновления собственных розничных и оптовых цен. Типичная ситуация: у вас есть файл Excel, где в первой колонке указано наименование или код товара, а в последующих колонках — различные виды цен (например, «Закупочная», «Оптовая», «Розничная»).

Если вы работаете в конфигурациях 1С на обычных формах, таких как «Управление торговым предприятием» (УТП), «Управление производственным предприятием» (УПП) или «Управление торговлей» редакции 10.3, то при попытке использовать стандартную обработку ЗагрузкаДанныхИзТабличногоДокумента вы неизбежно столкнетесь с проблемой. Выясним причину этого ограничения и подробно разберем несколько эффективных способов решения данной задачи.

Почему стандартная обработка не загружает несколько колонок цен напрямую?

Проанализируем структуру хранения данных в документе УстановкаЦенНоменклатуры в конфигурациях УТП и УПП. Этот документ устроен по принципу разделения типов цен по строкам, а не по колонкам. В нем присутствуют две ключевые табличные части:

  1. Табличная часть «Типы цен» — здесь регистрируется список видов цен, которые будут изменены этим документом.
  2. Табличная часть «Товары» — здесь содержится список номенклатуры. При этом для каждого товара создается отдельная строка на каждый тип цен.

Например, если у вас есть «Товар 1» и для него нужно установить две цены («Оптовая» и «Розничная»), в табличной части «Товары» документа 1С должно быть создано две отдельные строки: первая — для «Товара 1» с типом цен «Оптовая», вторая — для «Товара 1» с типом цен «Розничная».

Стандартная обработка ЗагрузкаДанныхИзТабличногоДокумента работает по жесткому алгоритму: одна строка в файле Excel конвертируется ровно в одну строку табличной части документа 1С. Она не умеет самостоятельно «расщеплять» одну строку файла с несколькими ценами на несколько строк в документе. Поэтому при сопоставлении колонок вы можете выбрать только один тип цен для загрузки. Попытка загрузить файл повторно для другого типа цен в тот же документ приведет либо к перезаписи существующих строк, либо к некорректному заполнению данных.

Рассмотрим по шагам четыре практических способа обойти это ограничение и загрузить все цены в один документ.

Способ 1. Трансформация структуры файла в Excel (без программирования)

Самый быстрый и элегантный способ решить задачу силами пользователя — привести структуру исходного Excel-файла к «плоскому» виду, который ожидает 1С. Нам необходимо преобразовать горизонтальную таблицу с колонками цен в вертикальную таблицу, где каждый тип цен будет представлен отдельной строкой.

Вместо исходной таблицы вида:

Номенклатура | Оптовая цена | Розничная цена

Мы должны получить таблицу вида:

Номенклатура | Тип цен | Цена

Выполнить такое преобразование за несколько секунд поможет мощный встроенный инструмент Excel — Power Query. Разберем этот процесс по шагам:

  1. Откройте ваш файл с ценами в Excel. Выделите всю таблицу с данными.
  2. Перейдите на вкладку меню «Данные» и в группе «Получить и преобразовать данные» нажмите кнопку «Из таблицы/диапазона». Excel автоматически преобразует ваш диапазон в «умную таблицу» и откроет редактор Power Query.
  3. В окне редактора выделите колонку с номенклатурой (или кодом/артикулом), кликните по ее заголовку правой кнопкой мыши и выберите пункт меню «Отменить свертывание других столбцов» (Unpivot Other Columns).
  4. Произойдет магия: Excel мгновенно перестроит таблицу. Колонки с типами цен превратятся в строки в новом столбце (он автоматически назовется «Атрибут»), а сами значения цен окажутся в столбце «Значение».
  5. Переименуйте столбец «Атрибут» в «Тип цен», а «Значение» — в «Цена».
  6. Нажмите кнопку «Закрыть и загрузить» на вкладке «Главная». Преобразованные данные будут выгружены на новый лист вашей книги Excel. Сохраните этот файл.

Теперь данные готовы к стандартной загрузке в 1С:

  1. Создайте в 1С новый документ УстановкаЦенНоменклатуры.
  2. Важно: на вкладке «Типы цен» вручную добавьте те типы цен, которые вы собираетесь загружать (например, «Оптовая» и «Розничная»). Если этого не сделать, система не запишет загруженные цены.
  3. Откройте обработку ЗагрузкаДанныхИзТабличногоДокумента. Выберите режим загрузки в табличную часть документа, укажите ваш созданный документ и выберите табличную часть «Товары».
  4. Настройте соответствие колонок:
    • Колонку с номенклатурой свяжите с реквизитом Номенклатура (используйте поиск по коду, артикулу или наименованию).
    • Колонку «Тип цен» свяжите с реквизитом ТипЦен (поиск по наименованию).
    • Колонку «Цена» свяжите с реквизитом Цена.
    • Также укажите валюту и единицу измерения, если они есть в вашем файле или заданы по умолчанию.
  5. Нажмите кнопку «Загрузить». Все цены для всех типов будут успешно загружены в один документ в виде соответствующих строк.

Способ 2. Пошаговая загрузка в несколько документов с последующим объединением (Обходной путь)

Если файлов или позиций немного, и вы не хотите использовать Power Query, можно воспользоваться более прямолинейным методом: загрузить цены поочередно для каждого типа цен в отдельные документы, а затем объединить их (или оставить как есть, ведь для проведения цен не принципиально, находятся они в одном документе или в нескольких).

Разберем этот алгоритм:

  1. В обработке ЗагрузкаДанныхИзТабличногоДокумента настройте загрузку для первого типа цен (например, «Закупочная»). Загрузите данные, создав новый документ УстановкаЦенНоменклатуры. Проведите его.
  2. Измените настройки обработки, указав колонку со вторым типом цен (например, «Розничная»). Запустите загрузку во второй документ. Проведите его.
  3. Если вам принципиально важно иметь все цены в одном документе, вы можете открыть первый документ, нажать кнопку «Заполнить» и выбрать команду «Добавить по типу цен», указав второй тип цен. Система автоматически дозаполнит документ недостающими строками на основании ранее проведенных документов.

Способ 3. Использование внешних обработок заполнения табличных частей

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

Принцип их работы предельно прост:

  1. Вы регистрируете обработку в базе через меню Сервис -> Дополнительные отчеты и обработки -> Дополнительные внешние обработки заполнения табличных частей.
  2. Открываете документ УстановкаЦенНоменклатуры, нажимаете кнопку «Заполнить» (или «Изменить») над табличной частью «Товары» и выбираете вашу загруженную обработку.
  3. В открывшемся окне выбираете исходный файл Excel. Обработка сама анализирует структуру файла и предлагает вам сопоставить колонки: например, Колонке №2 назначить тип цен «Оптовая», а Колонке №3 — «Розничная».
  4. Программа в автоматическом режиме создаст в документе все необходимые строки и заполнит как список типов цен в шапке, так и все товарные позиции с их ценами.

Способ 4. Программное решение задачи (Для разработчиков)

Если перед вами стоит задача автоматизировать этот процесс в коде конфигурации или написать собственную обработку загрузки, то необходимо правильно реализовать заполнение обеих табличных частей документа. Посмотрим на пример программного кода, который реализует эту логику:


// Создаем новый документ установки цен
НовыйДокумент = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.УстановитьНовыйНомер();

// 1. Сначала заполняем табличную часть "ТипыЦен"
// Это критически важно, иначе движения по регистрам сведений не запишутся
ТипЦенОпт = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Оптовая");
ТипЦенРозн = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");

Если Не ТипЦенОпт.Пустая() Тогда
    НоваяСтрокаТипа = НовыйДокумент.ТипыЦен.Добавить();
    НоваяСтрокаТипа.ТипЦен = ТипЦенОпт;
КонецЕсли;

Если Не ТипЦенРозн.Пустая() Тогда
    НоваяСтрокаТипа = НовыйДокумент.ТипыЦен.Добавить();
    НоваяСтрокаТипа.ТипЦен = ТипЦенРозн;
КонецЕсли;

// Предположим, мы читаем данные из файла Excel в цикле по строкам
// ВыборкаДанных - условный объект с прочитанными строками файла
Пока ВыборкаДанных.ПрочитатьСтроку() Цикл
    
    ТекущаяНоменклатура = Справочники.Номенклатура.НайтиПоКоду(ВыборкаДанных.КодТовара);
    Если ТекущаяНоменклатура.Пустая() Тогда
        Сообщить("Товар с кодом " + ВыборкаДанных.КодТовара + " не найден в базе!");
        Продолжить;
    КонецЕсли;
    
    // 2. Добавляем строку для ОПТОВОЙ цены, если она заполнена в файле
    Если ЗначениеЗаполнено(ВыборкаДанных.ЦенаОптовая) Тогда
        НоваяСтрокаТовара = НовыйДокумент.Товары.Добавить();
        НоваяСтрокаТовара.Номенклатура = ТекущаяНоменклатура;
        НоваяСтрокаТовара.ТипЦен = ТипЦенОпт;
        НоваяСтрокаТовара.Цена = ВыборкаДанных.ЦенаОптовая;
        НоваяСтрокаТовара.Валюта = Справочники.Валюты.НайтиПоКоду("643"); // Рубль или тенге
        НоваяСтрокаТовара.ЕдиницаИзмерения = ТекущаяНоменклатура.ЕдиницаХраненияОстатков;
    КонецЕсли;
    
    // 3. Добавляем строку для РОЗНИЧНОЙ цены, если она заполнена в файле
    Если ЗначениеЗаполнено(ВыборкаДанных.ЦенаРозничная) Тогда
        НоваяСтрокаТовара = НовыйДокумент.Товары.Добавить();
        НоваяСтрокаТовара.Номенклатура = ТекущаяНоменклатура;
        НоваяСтрокаТовара.ТипЦен = ТипЦенРозн; // Используем найденный розничный тип цен
        НоваяСтрокаТовара.Цена = ВыборкаДанных.ЦенаРозничная;
        НоваяСтрокаТовара.Валюта = Справочники.Валюты.НайтиПоКоду("643");
        НоваяСтрокаТовара.ЕдиницаИзмерения = ТекущаяНоменклатура.ЕдиницаХраненияОстатков;
    КонецЕсли;
    
КонецЦикла;

// Записываем и проводим документ
Попытка
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Документ установки цен успешно создан и проведен!");
Исключение
    НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Не удалось провести документ, он сохранен как черновик: " + ОписаниеОшибки());
КонецПопытки;

Проанализируем этот код. Ключевой момент здесь заключается в том, что для одной и той же номенклатуры (ТекущаяНоменклатура) мы делаем вызов метода НовыйДокумент.Товары.Добавить() дважды — отдельно для оптовой цены и отдельно для розничной. Именно такое поведение обеспечивает корректную структуру документа в базах данных УТП и УПП.

Используя предложенные методики, вы сможете эффективно решать задачи по массовому обновлению прайс-листов любой сложности, выбирая наиболее подходящий инструмент под конкретную ситуацию!

← На главную