На Инфостарте (да и в интернете) предлагают различные способы загрузки из внешних файлов. Это действительно часто помогает пользователям (если, конечно, файл имеет какую-то повторяющуюся структуру).
И - иногда люди хотят видеть именно загрузку из Excel-файла, а иногда .. привыкают к тому механизму, который уже реализовала 1с (но, почему-то, далеко не во всех документах).
Так случилось и в этот раз - пользователи обратились с пожеланием, чтобы в "Перемещении товаров" был такой же механизм, как и в поступлении ("Заполнить - Загрузить из внешнего файла").
Итак.
Механизм задействует две ключевые вещи:
1. Запуск обработки с формы документа - "Обработка.ЗагрузкаДанныхИзВнешнихФайлов";
2. Заполнение документа по данным обработки через событие формы "Обработка выбора".
**Обновлено 25.04.2020
Протестировано на 1С:Комплексная автоматизация 2 (2.4.11.65)
Код подходит для документов Оприходование Излишков Товаров и Списание Недостач Товаров, кроме вот этой строки
//специфика перемещения ++
СтрокаТЧТовары.КодСтроки=0;//код строки заказа
//специфика перемещения --
**Обновлено 23.12.2020
1. Протестировано на УТ 11.4.13
2. Убрано несколько зависимостей (не должно проверяться значение основного языка конфигурации, удалено обращение к картинке, которую удалили из актуальных релизов конфигурации)
**Обновлено 09.01.2022
1. Для Розницы тоже подходит (но листинг несколько отличается). Добавлено отдельное расширение под Розницу.
2. Протестировано на Розница 8, редакция 2.3 (2.3.10.36)
**Обновлено 28 .07.2022
Протестировано на 1С:Комплексная автоматизация 2 (2.5.8.232)
**Обновлено 24.08.2022
Внесена небольшая правка в Перемещение (Версии для КА,УТ,ERP)
**Обновлено 13.01.2023
Внесена небольшая правка во "Внутреннее потребление" (Версии для КА 2.5.10,УТ,ERP) [изменено имя метаданных в поставке]
Протестировано на 1С:Комплексная автоматизация 2 (2.5.10.52)
Реализация
1. Забираем в расширение форму документа "Перемещение товаров".
2. Создаем новую команду - "ЗагрузитьИзВнешнегоФайла", и создаем такой обработчик
&НаКлиенте
Процедура ЗагрузитьИзВнешнегоФайла(Команда)
ОтборТовар = Новый Массив(1);
ОтборТовар[0] = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Товар");
ПараметрыФормы = Новый Структура();
ПараметрыФормы.Вставить("ЗагружатьКоличество", Истина);
ПараметрыФормы.Вставить("ЗагружатьЦены", Ложь);
ПараметрыФормы.Вставить("ЗагружатьСуммы", Ложь);
ПараметрыФормы.Вставить("ЦенаВключаетНДС", ложь);
//ПараметрыФормы.Вставить("Партнер", Объект.Партнер);
//ПараметрыФормы.Вставить("СопоставлятьПоНоменклатуреПоставщиков", Истина);
ПараметрыФормы.Вставить("ЗагружатьГТД", Ложь);
ПараметрыФормы.Вставить("ЗагружатьЗапасы", Ложь);
ПараметрыФормы.Вставить("ЗагружатьСкидки", Ложь);
ПараметрыФормы.Вставить("ЗагружатьУпаковочныеЛисты", Ложь);
ПараметрыФормы.Вставить("ПересчитыватьСуммы", Истина);
ПараметрыФормы.Вставить("ЦенаВключаетНДС", Истина);
ПараметрыФормы.Вставить("Организация", Неопределено);
ПараметрыФормы.Вставить("НалогообложениеНДС",
ПредопределенноеЗначение("Перечисление.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС"));
ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", Новый ФиксированныйМассив(ОтборТовар));
ПараметрыФормы.Вставить("ИмяТЧ", "Товары");
ПараметрыФормы.Вставить("ЗагружатьСкидки", Ложь);
ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Загрузка товаров из внешних файлов'"));
ПараметрыФормы.Вставить("ПараметрыОтбора", Новый Структура);
ПараметрыФормы.Вставить("ДатаЗаполнения", '00010101');
Оповещение = Новый ОписаниеОповещения("ЗагрузитьИзВнешнегоФайлаЗавершение", ЭтотОбъект, "Товары");
РаботаСТабличнымиЧастямиКлиент.ПоказатьФормуЗагрузкиНоменклатуры(ПараметрыФормы, Оповещение);
КонецПроцедуры
3. Создаем оповещение, на которое мы сослались в предпоследней строке
4. Из него вызовем функцию "ПолучитьЗагруженныеТоварыИзХранилища", которую тут же и опишем. Сделано по аналогии с функцией в "Приобретении товаров и услуг", но выброшена часть кода.
&НаКлиенте
Процедура ЗагрузитьИзВнешнегоФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(АдресЗагруженныхДанных) Тогда
ПолучитьЗагруженныеТоварыИзХранилища(АдресЗагруженныхДанных, ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьЗагруженныеТоварыИзХранилища(АдресТоваровВХранилище, ИмяТЧ)
ТоварыИзХранилища = ПолучитьИзВременногоХранилища(АдресТоваровВХранилище);
КэшированныеЗначения = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
СтруктураДействий = Новый Структура;
//СтруктураДействий.Вставить("ЗаполнитьНоменклатуруПоставщикаПоНоменклатуре", Объект.Партнер);
Для Каждого СтрокаТоваров Из ТоварыИзХранилища Цикл
СтрокаТЧТовары = Объект[ИмяТЧ].Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЧТовары, СтрокаТоваров);
Если ИмяТЧ = "Товары" Тогда
ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(СтрокаТЧТовары, СтруктураДействий, КэшированныеЗначения);
КонецЕсли;
//специфика перемещения ++
СтрокаТЧТовары.КодСтроки=0;//код строки заказа
//специфика перемещения --
КонецЦикла;
КонецПроцедуры
Если есть желание поскорее окунуться в работу (и доработку механизма для своих задач), во вложении - готовое расширение.