Практика переноса информации из "Торговля и склад" 7.7 в УТ 11.3

Загрузчик номенклатуры и поступления из EXCEL в Управление торговлей 11.3 с дополнительными возможностями (артикулирование)

Доброго времени суток, уважаемый читатель.

   В связи с переходом на ККМ-онлайн возникла потребность в современных конфигурациях. Одной из популярных является "Управление торговлей" в варианте управляемого приложения. Она без проблем работает с торговым оборудованием, но заново перенести номенклатуру с остатками в неё представляет некоторую проблему. Эта статья как раз об этом, с использованием обработки для загрузки номенклатуры в данную конфигурацию.

   Имеется типовая конфигурация 1С v7.7. "Торговля + склад", редакция 9.2, оптово-розничная, релиз 7.70.936. Абсолютно ничего необычного, только есть небольшая доработочка касательно упаковок. Организация занимается оптовой торговлей, крупы, бакалея. Поэтому практически для каждой позиции номенклатуры заданы основная и базовая единицы измерения:

   Если продажа осуществляется оптом, используется базовая единица измерения — упаковки. Если в розницу, по весу или в штуках. Во время переноса необходимо это учесть. Также необходимо как то связать номенклатуру в "Торговле + склад" с номенклатурой в "Управлении торговлей". Я решил, что однозначно идентифицировать номенклатурные позиции можно по полю "Код" в "Торговле и склад", только в "Управлении торговлей" его нужно завести в поле "Артикул". Для этого был взят стандартный отчёт "Остатки ТМЦ":

    Раз уж его нужно было дорабатывать, решил ещё вывести информацию и о весе. Сохранил из конфигуратора данный отчёт как внешний:

   и сделал небольшую доработку: ввёл в табличную часть две колонки (в вертикальную секцию "Сумма"):

   На всякий случай напомню, что оформлять эти переменные, разумеется, нужно как выражение:

   В модуле внешней обработки нужно дописать следующее:

Получить переменные из запроса, которые пойдут в горизонтальную секцию "Строка" таблицы

Пока ТЗ.ПолучитьСтроку() = 1  Цикл
ПечТекстСтроки = ТЗ.ПечТекстСтроки;
// Начало доработки
НашАртикул=ТЗ.Артикул;
НашВес=ТЗ.Вес;
// Конец доработки
Если ПризнакЛоток = 1 Тогда

Соответственно добавить две колонки в процедуру "Сформировать"

ТЗ = СоздатьОбъект("ТаблицаЗначений");
// Начало доработки
ТЗ.НоваяКолонка("Артикул","Строка");
ТЗ.НоваяКолонка("Вес","Число");
// КонецДоработки
ТЗ.НоваяКолонка("ПечТекстСтроки", "Строка");

И ещё в конце цикла прохода по группировке "Номенклатура"

ЗаполнитьСтроку(ТЗ, Запрос, СписокСкладов, ВДокумент);
КонецЕсли;
// Начало доработки
ТЗ.Артикул=ТМЦ.Код;
ТЗ.Вес = ТМЦ.БазоваяЕдиница.Вес;
// КонецДоработки
глОживить(1);

   В результате должен получиться отчёт с колонками, содержащими код и вес номенклатурной позиции:

   Теперь код и вес можно считать обработкой из "Управления торговлей" 1C v8. Для тех, кому неохота сделать простенькую работу, но есть лишний стартмани, готовая обработка для выгрузки из 7.7 любезно предоставлена внизу статьи.

   Запускаем обработку ("Файл" —> "Открыть" —> Загрузчик.epf)

   В поле "Файл" указываем файл, выгруженный из "Торговля и склад 7.7". Если всё сделано правильно, должны заполниться колонки "Артикул", "Номенклатура файла", "Единица файла", "Вес" и "Количество"

   Постольку, поскольку эти данные взяты из модернизированного отчёта "Остатки ТМЦ", заполнятся ещё колонки "Количество", "Цена" и "Сумма". Можно было бы просто выгрузить всю базу и загрузить табличную часть в документ "Ввод остатков". Но было решено пойти другим путём в силу веских причин.

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

   После того, как вся номенклатура была перенесена в обработку был добавлен режим загрузки данных из документов поступления.

   При печати формы "М-4" документа "Поступление ТМЦ" получается прекрасный документ для загрузки приходной накладной. Он содержит артикул и данные о количестве и цене. Все остальные данные могут быть вычислены:

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

   Выбрать, соответственно нужно EXCEL файл, соответствующий выгруженной накладной:

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

   Если же нет, то нужно будет разбираться с пустыми, или ещё хуже, неправильно заполненными строчками и снова делать загрузку в исходном режиме, то есть загрузки и создания номенклатуры. Такая ситуация может возникнуть, например, при поступлении нового товара или при пересортице. Поэтому было решено работать сразу в двух программах, сначала занести приход и расход в семёрке в рабочем режиме, а затем продублировать в восьмёрке и постепенно решать возникающие вопросы. Так и сделали, всё шло по плану, пока не…

   Возникла ещё одна "простенькая задача". При фасовке сахара, например, из мешков по 50 килограмм, необходимо добавлять немного к цене за килограмм для оплаты труда фасовщика. Причём эта наценка должна быть фиксированной, например, при фасовке двух мешков по 25 кг. из 50кг. необходима наценка по 40коп. за кг., соответственно цена мешка должна быть увеличена на 10р.

   Итак, какими путями я шёл: (Над входом в них я вешаю табличку: "Оставь надежду, всяк сюда входящий").

   1) Управление торговлей 11.3 обладает колоссально гибким механизмом задания цены при помощи произвольного запроса к базе данных. Я попробовал его реализовать:

   Создал цену с типом "Произвольный запрос к данным ИБ" и попробовал разобраться, как обратиться к строке с единицей измерения текущего документа, чтобы при определённых условиях сделать наценку.

   Увидел вот такую картину:

и, честно говоря, растерялся. Что делать дальше, как в песне, путано и непонятно. Попытался найти инструкцию на инфостарте, нашёл статью //infostart.ru/public/331784/ уважаемого Андрея Карпова (karpik666), но всё равно разобраться не смог.

   2) Решил пойти по более простому пути:

   А именно, создать цену способом применения произвольной формулы от другого вида цен. Но тут тоже оказалось не всё так просто. Не смог правильно вставить в формулу ссылку на упаковки, или на единицу измерения. Поэксперементировал, но не получилось:

   Посмотрел в конфигураторе, как правильно ссылаться на упаковку из справочника Номенклатура, но ничего не насмотрел. Брал из модуля объекта справочника "Номенклатура":

Если ЗначениеЗаполнено(ВидНоменклатуры) Тогда
ШаблонРабочегоНаименования = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидНоменклатуры, "ШаблонРабочегоНаименованияНоменклатуры");
Если ЗначениеЗаполнено(ШаблонРабочегоНаименования) Тогда
МассивНепроверяемыхРеквизитов.Добавить("Наименование");
КонецЕсли;
КонецЕсли;

Если ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Услуга
Или ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Работа Тогда
МассивНепроверяемыхРеквизитов.Добавить("ЕдиницаИзмерения");
КонецЕсли;

   Пошёл по третьему пути, и получил удовлетворительный результат. Так как с ценами ничего не получилось, решил создать скидку, которую также можно использовать, как и наценку:

     Первое, что нужно было сделать, это привязать её к конкретной номенклатуре, или к номенклатуре из списка. Это оказалось несложно, так как нижнее поле "Предоставляется на" как раз для этого и предназначено:

   Хочу остановиться на этом месте поподробнее. Мне очень помогло наличие именно второго и третьего пунктов. Дело в том, что для разных цен понадобились разные проценты, и если я выбирал "Номенклатуру из списка" в обоих скидках, применялась только одна, а если в другой "Номенклатуру по отбору", то всё работало.

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

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

   Ну, и соответственно, условий должно быть два:

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

   Вот, собственно, и всё.

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

   Единственное неудобство, наценка рассчитается либо при закрытии документа, либо при выборе пункта "Рассчитать скидки (наценки)", но с этим можно жить.

   По загрузке на этом всё. Теперь хотелось бы немного про грабли или подводные камни. Скорее всего вы с этим столкнётесь, поэтому, не поленюсь, опишу. По желанию заказчика было создано несколько видов цен: "Закупочная" со способом задания цены "Произвольный запрос к данным ИБ", "Очень крупнооптовая" с ручным заданием цен, а также "Крупнооптовая", "Среднеоптовая", "Мелкооптовая" и "Розничная" со способом задания цены "Наценка на другой вид цен" с базовым видом цены "Очень крупнооптовая". Возникла небольшая проблема при вводе документа "Установка цен номенклатуры" на основании документа "Поступление товаров и услуг, закупка у поставщика". После ввода документа "Поступление"на его основании необходимо ввести документ "Установка цен номенклатуры". После перехода к составу цен получается вот такая картина:

   То есть отмечена только закупочная цена, а остальные галочки нужно проставлять руками. Стал разбираться, почему так получается, сделал вывод, что дело в чекбоксе:

который никак нельзя установить. Разумеется, для того, чтобы вообще что-то изменить в уже существующем справочнике, сначала нужно нажать кнопочку "Ещё", выбрать там пункт "Разрешить редактирование реквизитов" и только потом пытаться что-то изобразить:

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

   Вместо эпилога немного расскажу про процедуру обработки Прочитать тем, кто будет разбирать код.

Если НЕ(Объект.Накладная) Тогда

   На это не обращаем внимания, взято из предыдущей обработки для другого заказчика. Оставил по принципу работает, ну и пусть будет.

   Дальше идут настройки на лист excel, несколько переменных, в которых цифры обозначают определённые колонки листа. Если будете загружать из своего файла, обязательно проверьте соответствие. Иначе, разумеется, загружаться ничего не будет.

ДлинаЗг = 3;            // Длина заголовка
НаимЗаг = "ТМЦ";        // Наименование заголовка

   Это своеобразная сигнатура, переменная ДлинаЗг определяет количество анализируемых символов, а НаимЗаг собственно заголовок, после которого начинаются строки с номенклатурой.

   Дальше в цикле перебираем все строчки с товаром, дополняем артикул ведущими нулями. Можно было использовать формат, но мне так показалось надёжнее и правильнее.

   Закладка "Артикулирование" опять же наследство от родительской обработки. В данном случае мы жёстко делаем артикул из кода товара базы 7.7, но если бы загружали произвольную накладную и хотели присвоить каким то образом артикул, то возможно появились бы двойники. На этой вкладке для борьбы с этим безобразием есть кнопочка "Проверить повторы".

На закладке "Настройка" есть возможность поставить галочку "Накладная" для выбора других настроек на лист excel.

   Собственно, всё. Буду рад почитать ваши комментарии и пожелания. Скачавшим, пишите, подскажу.

   С уважением к читателю и его работе, Виктор Земсков.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *