Сопоставь несопоставленное - пример работы с сопоставлением номенклатуры контрагентов
Функциональные - Документооборот и делопроизводство (СЭД)
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
В библиотеке электронных документов, которая встроена в ряд типовых конфигураций 1С, есть механизмы сопоставления номенклатуры контрагентов из ЭДО с номенклатурой базы 1С. Особенно интересно данный функционал представлен в обработке «Сопоставление номенклатуры (БЭД)» (СопоставлениеНоменклатурыБЭД), где у пользователя даже есть возможность настроить точность поиска.
И когда появилась задача сопоставлять номенклатуру из чеков ФНС (для обработок по загрузке чеков: здесь и здесь), то пришлось разбираться как этот механизм можно использовать для решения прикладных задач, несвязанных с ЭДО.
На форму выносим кнопку с командой:
&НаКлиенте
Процедура СопоставитьНоменклатуру(Команда)
ПоказатьСопоставлениеНоменклатуры();
КонецПроцедуры
И добавляем отредактированную (относительно исходной) процедуру:
&НаКлиенте
Процедура ПоказатьСопоставлениеНоменклатуры()
НоменклатураДляСопоставления = Новый Массив;
Владельцы = Новый Массив;
НоменклатураКонтрагентовМассив = Новый Массив;
НоменклатураДляСопоставления = НоменклатураПоВладельцам(Владельцы,НоменклатураКонтрагентовМассив);
Если Не ЗначениеЗаполнено(НоменклатураДляСопоставления) Тогда
ТекстСообщения = НСтр("ru = 'Сопоставление номенклатуры не требуется.'");
ПоказатьПредупреждение(, ТекстСообщения);
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура("НоменклатураДляСопоставления", НоменклатураДляСопоставления);
ОбработкаЗавершения = Новый ОписаниеОповещения("ОбработатьСопоставлениеНоменклатуры", ЭтотОбъект, ДополнительныеПараметры);
СопоставлениеНоменклатурыКонтрагентовКлиент.ОткрытьСопоставлениеНоменклатуры(НоменклатураДляСопоставления, , ОбработкаЗавершения);
КонецПроцедуры
Вставляем две функции по предварительному заполнению массивам, который будет передан для сопоставления. Запрос в функции «НоменклатураКонтрагентовНаКонтроле» изменён относительно первоначального.
&НаСервере
Функция НоменклатураПоВладельцам(Владельцы, НоменклатураКонтрагентовМассив)
Возврат НоменклатураКонтрагентовНаКонтроле(Владельцы, НоменклатураКонтрагентовМассив);
КонецФункции
&НаСервере
Функция НоменклатураКонтрагентовНаКонтроле(Владельцы, НоменклатураКонтрагентовМассив)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗПокупки.НазваниеТовара КАК Наименование,
| ТЗПокупки.Контрагент КАК Владелец,
| ТЗПокупки.НомерСтроки КАК НомерСтроки
|ПОМЕСТИТЬ ВТ
|ИЗ
| &ТЗПокупки КАК ТЗПокупки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.Наименование КАК Наименование,
| ВТ.Владелец КАК Владелец,
| ВТ.НомерСтроки КАК Идентификатор,
| ВТ.НомерСтроки КАК ИдентификаторНоменклатуры,
| ВТ.НомерСтроки КАК НомерСтроки
|ИЗ
| ВТ КАК ВТ";
НаборНоменклатурыКонтрагентов = Новый Массив;
ТЗПокупки = Объект.Покупки.Выгрузить();
Запрос.УстановитьПараметр("ТЗПокупки",ТЗПокупки);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоменклатураКонтрагента = СопоставлениеНоменклатурыКонтрагентовКлиентСервер.НоваяНоменклатураКонтрагента();
НоменклатураКонтрагента.Вставить("НомерСтроки","");
ЗаполнитьЗначенияСвойств(НоменклатураКонтрагента, Выборка);
ИдентификаторНоменклатуры = СтрЗаменить(НоменклатураКонтрагента.Наименование," ","");
НоменклатураКонтрагента.Идентификатор = ИдентификаторНоменклатуры + "##";
НоменклатураКонтрагента.ИдентификаторНоменклатуры = ИдентификаторНоменклатуры;
НаборНоменклатурыКонтрагентов.Добавить(НоменклатураКонтрагента);
КонецЦикла;
Возврат НаборНоменклатурыКонтрагентов;
КонецФункции
Добавляем процедуру завершения (в которой добавлен небольшой цикл обработки полученного в результате сопоставления массива «Результат»):
&НаКлиенте
Процедура ОбработатьСопоставлениеНоменклатуры(Результат, ДополнительныеПараметры) Экспорт
Если Не Результат = Неопределено Тогда
Для Итератор = 0 По Результат.Количество()-1 Цикл
НоменклатураИзЧека = Результат[Итератор].НоменклатураКонтрагента.Наименование;
НоменклатураИзБазы = Результат[Итератор].НоменклатураКонтрагента.НоменклатураИБ;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("НазваниеТовара", НоменклатураИзЧека);
НайденныеСтроки = Объект.Покупки.НайтиСтроки(ПараметрыОтбора);
Для каждого НайденнаяСтрока из НайденныеСтроки Цикл
НайденнаяСтрока.Номенклатура = НоменклатураИзБазы;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Представленный код можно взять и применить в своём решении. Если нет времени на самостоятельную разработку, то можно воспользоваться уже готовым решением.
Пример использования (на основании приложенной к публикации обработки). Имеется три названия товара, принадлежащие двум контрагентам. Следует сопоставить эти названия с номенклатурой из типовой «1С:Бухгалтерия предприятия, редакция 3.0». Убеждаемся, что во всех строках есть названия товара и указаны контрагенты и вызываем команду «Сопоставить номенклатуру».

Открывается типовая форма «Сопоставление номенклатуры», где программа отражает уже имеющиеся элементы номенклатуры.

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

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

Если не все позиции номенклатуры сопоставить, то при нажатии на кнопку «Сохранить и закрыть» выйдет соответствующее сообщение. Сопоставленные позиции сохраняются в справочник «НоменклатураКонтрагентов» и регистр сведений «НоменклатураКонтрагентовБЭД», которые в пользовательском режиме отражаются одинаково как «Номенклатура контрагентов».

В результате в столбце «Номенклатура» отразится сопоставленная номенклатура.

Разработка и тестирование осуществлялись на типовой конфигурации «Бухгалтерия предприятия, редакция 3.0» (3.0.93.20) и платформе 1С:Предприятие 8.3 (8.3.18.1289).
Вступайте в нашу телеграмм-группу Инфостарт