Пишу внешнюю обработку для заполнения табличной части документа Реализация товаров и услуг в Конфигурации УТ 11. Суть в том, что нужно скорректировать количество для каждой позиции номенклатуры в зависимости от того, сколько данного товара есть на складе.
Код модуля объекта самой обработки:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Корректировка количества товара в РТУ");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка для корректировки количества товара в табличной части документа Реализация товаров и услуг");
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Корректировка количества по остаткам", "КорректировкаКоличестваПоОстаткам", "ВызовКлиентскогоМетода", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецФункции
Показать
Здесь вопросов нет. При подключении обработки в форме документа добавляется кнопка "Заполнение / Корректировка количества по остаткам".
Дальше создаю в обработке форму и в модуле формы пишу следующий код:
&НаКлиенте
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения) Экспорт
ДанныеФормыРТУОбъект = ВладелецФормы.Объект;
ЗаполнитьОбъектНаСервере(ДанныеФормыРТУОбъект);
КопироватьДанныеФормы(ДанныеФормыРТУОбъект, ВладелецФормы.Объект);
ВладелецФормы.Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьОбъектНаСервере(ДанныеФормыОбъект)
ТЧ = ДанныеФормыОбъект.Товары;
Для Каждого Строка Из ТЧ Цикл
// здесь будет запрос к регистру накопления ТоварыНаСкладахОстатки, чтобы узнать остатки товара
// пока для наглядности пусть в документе будет каждого товара по одной штуке
Строка.Количество = 1;
КонецЦикла;
КонецПроцедуры
Показать
Собственно и всё, а пользователь пусть сам решает сохранять ему документ или продолжить редактирование.
Вопрос лишь в том, что изменение количества в реквизите "Товары" никак не отображается на форме документа, то есть в данном конкретном случае пользователь после изменения объекта увидит не единички в поле "Количество", а прежнее количество. Кроме того, если нажать кнопку "Записать объект", закрыть и заново открыть документ, то там по-прежнему будет старое количество, а не единички.
На самом деле, первоначальный код, можно сказать, полностью рабочий. Просто изначально какая-то подстава вышла с колонкой таблицы Количество, в которой почему-то отображается не количество штук, а количество упаковок. Поскольку я менял значения поля Количество (а не КоличествоУпаковок), то на экране табличная часть для меня оставалась неизменной. В общем, дальше нужно разбираться именно с логикой отображения количества штук и количества упаковок табличной части реквизита Товары в форме документа РеализацияТоваровУслуг, но это уже, как говорится, другая история.
в продолжение темы... если в сведениях о внешней обработке указать тип команды использования ЗаполнениеФормы, а не ВызовКлиентскогоМетода, то можно в самом модуле внешней обработки через ПараметрыВыполнения.ЭтаФорма непосредственно работать с контекстом формы документа, из которого эта обработка вызывается. тогда ничего не нужно никуда копировать. боле того, можно сходу (прямо из внешней обработки) менять форму стандартного документа: применять условное оформление, добавлять новые реквизиты вместе с элементами формы и выводить в них дополнительную информацию из регистров и справочников. правда, для этого нужно, чтобы типовая конфигурация поддерживала более-менее новую версию БСП. если интересно, вот ссылка на мою публикацию по этой теме: http://infostart.ru/public/518037/