При работе с отраслевым решением 1С-Рарус: Розница. Ювелирный магазин пользователи часто сталкиваются с необходимостью массовой загрузки данных о поступлении товаров из внешних файлов (Excel, CSV, табличные документы). Для этого используется стандартная или модифицированная обработка «Загрузка данных из табличного документа». Одной из распространенных проблем является появление «фантомных» пустых строк в документе поступления после завершения процесса загрузки, а также необходимость автоматического создания карточек номенклатуры, если их еще нет в базе.
В данной статье мы разберем, как правильно настроить алгоритм загрузки, реализовать проверку на существование товара по артикулу и, самое главное, как предотвратить попадание пустых строк в итоговый документ.
Проанализируем ситуацию: когда мы используем режим Вычислять для заполнения реквизитов в обработке загрузки, система выполняет написанный нами программный код для каждой строки таблицы-источника. Если в исходном файле Excel после основных данных идут пустые строки (которые 1С часто считывает как строки, содержащие пустые значения или пробелы), обработка пытается их обработать. Если в коде нет жесткого условия прерывания, создается пустая строка в табличной части документа ПоступлениеТоваров.
Попытки решить проблему через событие После добавления строки с вызовом метода Записать() часто приводят к ошибке Метод объекта не обнаружен (записать). Это происходит потому, что в контексте обработки загрузки переменная Объект может не являться ссылкой на документ, а сама форма обработки не всегда имеет прямой доступ к методу записи записываемого объекта в этой точке выполнения.
Самый эффективный способ борьбы с лишними строками — это их отсечение еще на этапе предварительного анализа, до того как данные начнут записываться в объект. В настройках обработки «Загрузка из табличного документа» найдем вкладку или поле для ввода кода события «Перед обработкой строки».
Рассмотрим пример кода, который проверяет ключевое поле (например, Артикул в колонке №9) на заполненность. Если поле пустое, мы даем системе команду пропустить эту строку:
// Проверяем, заполнена ли ячейка с артикулом
// Используем СокрЛП для удаления невидимых пробелов
Если СокрЛП(ТекстыЯчеек[9]) = "" Тогда
// Устанавливаем стандартный параметр Отказ в Истина
Отказ = Истина;
КонецЕсли;
Этот простой блок кода гарантирует, что строки, где отсутствует артикул, не будут даже рассматриваться системой для создания объектов или добавления в документ.
Часто требуется, чтобы система не просто искала товар, но и создавала его «на лету», если поиск по артикулу не дал результатов. Выясним, как правильно реализовать этот алгоритм в вычисляемом поле для реквизита Номенклатура (или Имя в терминологии обработки).
Разберем по шагам алгоритм, представленный ниже:
СправочникОбъект.Номенклатура.Пример реализации:
Если НЕ СокрЛП(ТекстыЯчеек[9]) = "" Тогда
// Ищем номенклатуру по артикулу
СсылкаНоменклатуры = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", СокрЛП(ТекстыЯчеек[9]));
Если СсылкаНоменклатуры.Пустая() Тогда
// Создаем новый элемент, если не нашли
НовыйОбъект = Справочники.Номенклатура.СоздатьЭлемент();
НовыйОбъект.Наименование = СокрЛП(ТекстыЯчеек[5]); // Допустим, наименование в 5-й колонке
НовыйОбъект.Артикул = СокрЛП(ТекстыЯчеек[9]);
// Важно: в актуальных версиях используйте НДС 20%
НовыйОбъект.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Поиск базовой единицы измерения
НовыйОбъект.ЕдиницаИзмерения = Справочники.БазовыеЕдиницыИзмерения.НайтиПоНаименованию("шт");
// Специфика Ювелирного магазина: установка вида номенклатуры
НовыйОбъект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Ювелирное изделие");
Попытка
НовыйОбъект.Записать();
Результат = НовыйОбъект.Ссылка;
Исключение
Сообщить("Ошибка при записи новой номенклатуры: " + ОписаниеОшибки());
Результат = Справочники.Номенклатура.ПустаяСсылка();
КонецПопытки;
Иначе
// Если нашли — возвращаем ссылку на существующий товар
Результат = СсылкаНоменклатуры;
КонецЕсли;
КонецЕсли;
Проанализируем ситуацию из сообщения №2, где пользователь пытался удалять строки и вызывать Объект.Записать(). В 1С контекст выполнения кода крайне важен. Внутри обработки загрузки Объект — это чаще всего сама обработка, у которой нет метода Записать, так как она не является документом или справочником.
Если вы хотите программно модифицировать документ после того, как в него добавлена строка, следует использовать доступ к табличной части через ЭтотОбъект (если код пишется в модуле объекта документа) или через параметры, передаваемые в обработку загрузки. Однако, правильнее всего не допускать добавления пустой строки (как в Решении 1), чем пытаться удалять её после добавления.
Работая с решением от Рарус, важно помнить о дополнительных реквизитах, которые критичны для ювелирного учета:
ХарактеристикуНоменклатуры.ЕдиницаХраненияОстатков, иначе вы не сможете провести документ ПоступлениеТоваров.Для пользователей, переходящих на «1С-Рарус: Ювелирный магазин», часто актуален вопрос загрузки из формата DBF (сообщение №9). В данной конфигурации рекомендуется использовать не ручное написание кода, а встроенные профили обмена данными. В справочнике «Настройки загрузки данных» можно создать профиль, выбрать тип файла DBF и визуально сопоставить поля файла с реквизитами документа. Это избавит от необходимости писать сложные запросы к объекту XBase вручную.
Таким образом, комбинируя фильтрацию пустых строк в событии Перед обработкой строки и грамотное создание объектов через Справочники.Номенклатура.СоздатьЭлемент(), мы получаем надежный инструмент для автоматизации складского учета в ювелирном магазине.