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