Одной из частых задач при автоматизации торговых процессов в 1С 7.7 «Торговля и Склад» является настройка автоматического формирования заказов. Базовая функциональность не всегда позволяет жестко привязать товар к конкретному поставщику для фильтрации в документах. Давайте разберем по шагам, как решить эту задачу с помощью доработки конфигурации.
Наиболее корректным способом, не требующим кардинального изменения структуры базы данных, является использование штатного справочника Аналоги. В этом случае мы воспринимаем владельца каталога как поставщика (контрагента).
Для автоматизации заполнения заказа по минимальному остатку с учетом принадлежности товара поставщику, нам необходимо модифицировать процедуру ЗаполнитьПоМинОстатку. Суть метода заключается в предварительном сборе номенклатуры, относящейся к выбранному контрагенту, в таблицу значений.
Рассмотрим пример кода для фильтрации товаров в запросе:
ТекстЗапроса = \"
|Номенклатура = Справочник.Аналоги.Владелец;
|Поставщик = Справочник.Аналоги.Каталог.ВладелецКаталога;
|Условие(Поставщик = Контрагент);
|Группировка Номенклатура Без групп;\";
ЗапросНоменклатурыПоставщика = СоздатьОбъект(\"Запрос\");
Если ЗапросНоменклатурыПоставщика.Выполнить(ТекстЗапроса) = 1 Тогда
ТаблицаНоменклатурыПоставщика = СоздатьОбъект(\"ТаблицаЗначений\");
ЗапросНоменклатурыПоставщика.Выгрузить(ТаблицаНоменклатурыПоставщика,0,0);
КонецЕсли;
После получения этой таблицы мы можем использовать метод НайтиЗначение при обходе основного запроса по минимальным остаткам, чтобы отсечь лишние позиции, которые данный поставщик не поставляет.
Если вам требуется видеть список поставщиков прямо в карточке товара или в форме подбора, рекомендуется вывести отдельную таблицу значений на форму. Для получения данных о поставщиках конкретной позиции используйте следующий алгоритм:
Проанализируем процедуру заполнения списка поставщиков:
Процедура ЗаполнитьТаблицуПоставщиков()
ТаблицаПоставщиков.УдалитьСтроки();
ТекстЗапроса = \"
|Аналог = Справочник.Аналоги.ТекущийЭлемент;
|Номенклатура = Справочник.Аналоги.Владелец;
|Поставщик = Справочник.Аналоги.Каталог.ВладелецКаталога;
|Условие(Номенклатура = ТекНоменклатура);
|Группировка Аналог Без групп;\";
// ... выполнение запроса и перебор результатов
КонецПроцедуры
Важным аспектом является получение актуальной цены закупки. Если ваша учетная политика предполагает партионный учет (FIFO или LIFO), данные лучше извлекать из регистра ПартииНаличие. Это позволит увидеть не только цену, но и дату последнего поступления.
Рассмотрим пример запроса к регистру для расчета средней цены:
ТекстЗапроса = \"
|Поставщик = Регистр.ПартииНаличие.Партия.Поставщик;
|ЗакупочнаяЦена = Регистр.ПартииНаличие.Партия.ЗакупочнаяЦена;
|Количество = Регистр.ПартииНаличие.Количество;
|Функция КоличествоКонОст = КонОст(Количество);
|Условие(Номенклатура = ТекНоменклатура);
|Группировка ЗакупочнаяЦена;\";
Сообщить(): При возникновении ошибок или некорректных расчетов сумм, выводите промежуточные значения (цены, остатки, флаги) в окно сообщений. Это лучший способ понять, на каком этапе «съезжает» логика.Число перед математическими операциями: Сумма = Сумма + Число(Цена) * Число(Остаток).РезультатЗапроса, не создавая избыточных вложенных циклов.Учетной политике фирмы.Настройка подобных механизмов требует осторожности при работе с Запрос и ТаблицаЗначений. Если вы планируете внедрить подбор, не перегружайте основную форму тяжелыми запросами — лучше вынести аналитику в отдельную Обработка, открываемую по кнопке. Это сохранит высокую скорость работы интерфейса даже на слабых компьютерах.