Иногда требуется внести в документ поступления много в общем-то идентичных строчек, например, при оформлении добровольного медицинского страхования или при приобретении программного обеспечения. Отличия строчек только в статьях расходов, и, как следствие, аналитики расходов. Именно для заполнения статьями с типом значения Прочие расходы и создавался код.
До этого сначала была написана обработка, которая программно создает элементы плана видов характеристик Статьи Расходов и элементы справочника Прочие расходы. Найти ее можно по адресу: Программное создание элементов планы видов характеристик Статья расходов по шаблону.
Объединять код создания статей расходов и заполнения табличной части документа я не планирую, не очень люблю комбинированные решения. При желании, сделайте это самостоятельно.
Следующим же шагом, значительно облегчившим жизнь рядового сотрудника бухгалтерии, стало написание данного кода.
Наиболее удобно оказалось написать заполнение табличной части документов используя расширение конфигурации. Связано это с тем, что в типовом механизме заполнения при изменении, например поля Количество, выполняется рад необходимых действий с другими реквизитами документа. Именно в процедурах ME_РасходыКоличествоПриИзменении и ME_РасходыСтатьяРасходовПриИзменении выполняются действия, которые имитируют действия типовых процедур РасходыКоличествоПриИзменении и РасходыСтатьяРасходовПриИзменении из типового модуля формы элемента. На мой взгляд, для начинающего программиста, может оказаться интересным способ позиционирования на текущей строке и поле формы.
Итак, привожу пример такой реализации заполнения табличной части документа используя значения, полученные из формы заполнения.
Предполагаем, что расширение конфигурации уже существует с БД. Сперва добавляем ФормуДокумента для документа ПриобретениеУслугПрочихАктивов в расширение. Создаем свою команду ЗаполнитьРБП, назначаем действие для команды и размещаем на форме в группе РасходыЗаполнить.
Ниже привожу полный код модуля формы ФормаЭлемента из расширения:
&НаКлиенте
Процедура ME_ЗаполнитьРБППосле(Команда)
//открыть форму получить из нее значения и заполнить ТЧ документа
ПараметрыОткрытия = Новый Структура("ТолькоПросмотр",Истина);
Оповещение = Новый ОписаниеОповещения("ЗаполнениеПараметровЗавершение", ЭтаФорма);
ОткрытьФорму("Документ.ПриобретениеУслугПрочихАктивов.Форма.ME_ФормаЗаполненияРБП",ПараметрыОткрытия,ЭтаФорма,,,,Оповещение,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнениеПараметровЗавершение(Результат, Параметры) Экспорт
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Возврат;
КонецЕсли;
Данные = Новый Структура();
Данные.Вставить("Количество",Результат.Количество);
Данные.Вставить("Цена",Результат.Цена);
МассивСтатьиРасходов = Новый Массив;
Для каждого Эл из Результат.МассивДанных Цикл
МассивСтатьиРасходов.Добавить(Эл);
КонецЦикла;
Данные.Вставить("МассивСтатьиРасходов",МассивСтатьиРасходов);
ЗаполнитьТЧРасходы(Данные);
ДозаполнитьТЧРасходы();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТЧРасходы(Данные)
ПараметрыЗаполнения = Новый ТаблицаЗначений;
ПараметрыЗаполнения.Колонки.Добавить("СтатьяРасходов",,"СтатьяРасходов");
ПараметрыЗаполнения.Колонки.Добавить("АналитикаРасходов",,"АналитикаРасходов");
ПараметрыЗаполнения.Колонки.Добавить("Содержание",,"Содержание");
ПараметрыЗаполнения.Колонки.Добавить("Количество",,"Количество");
ПараметрыЗаполнения.Колонки.Добавить("Цена",,"Цена");
Для каждого Эл из Данные.МассивСтатьиРасходов Цикл
НоваяСтрока = ПараметрыЗаполнения.Добавить();
НоваяСтрока.СтатьяРасходов = Эл;
НоваяСтрока.Содержание = Эл.Наименование;
НоваяСтрока.Количество = Данные.Количество;
НоваяСтрока.Цена = Данные.Цена;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПрочиеРасходы.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрочиеРасходы КАК ПрочиеРасходы
|ГДЕ
| ПрочиеРасходы.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", Эл);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Количество() = 0 Тогда
ОбщегоНазначения.СообщитьПользователю("Аналитика отсутствует для статьи: " + НоваяСтрока.СтатьяРасходов);
Продолжить;//прекращаем выполнение этой итерации цикла
КонецЕсли;
Если Выборка.Количество() > 1 Тогда
ОбщегоНазначения.СообщитьПользователю("Аналитика не уникальна для статьи: " + НоваяСтрока.СтатьяРасходов);
КонецЕсли;
Если Выборка.Следующий() Тогда
НоваяСтрока.АналитикаРасходов = Выборка.Ссылка;
КонецЕсли;
КонецЦикла;
ТЧ = Объект.Расходы;
ТЧ.Очистить();
Для каждого СтрокаТЧ из ПараметрыЗаполнения Цикл
НоваяСтрока = ТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТЧ);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ДозаполнитьТЧРасходы()
//дозаполнить ТЧ документа имитируя ручное заполнение, см. аналогичные процедуры ПриИзменении
Для каждого Эл из Объект.Расходы Цикл
ME_РасходыКоличествоПриИзменении(Эл);
ME_РасходыСтатьяРасходовПриИзменении(Эл);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ME_РасходыКоличествоПриИзменении(Эл)
ЭтаФорма.Элементы.Расходы.ТекущаяСтрока = Эл.ПолучитьИдентификатор();
ТекущиеДанные = Элементы.Расходы.ТекущиеДанные;
ТекущаяСтрока = Новый Структура;
ТекущаяСтрока.Вставить("Количество", ?(ТекущиеДанные.Количество <> 0, ТекущиеДанные.Количество, 1));
ТекущаяСтрока.Вставить("Цена", ТекущиеДанные.Цена);
ТекущаяСтрока.Вставить("Сумма", ТекущиеДанные.Сумма);
ТекущаяСтрока.Вставить("СтавкаНДС", ТекущиеДанные.СтавкаНДС);
ТекущаяСтрока.Вставить("СуммаНДС", ТекущиеДанные.СуммаНДС);
ТекущаяСтрока.Вставить("СуммаСНДС", ТекущиеДанные.СуммаСНДС);
ТекущаяСтрока.Вставить("СуммаВзаиморасчетов", ТекущиеДанные.СуммаВзаиморасчетов);
СтруктураДействий = Новый Структура;
ДобавитьВСтруктуруДействияПриИзмененииКоличества(СтруктураДействий, ЭтаФорма);
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
ЗаполнитьЗначенияСвойств(ТекущиеДанные, ТекущаяСтрока, , "Количество");
КонецПроцедуры
&НаКлиенте
Процедура ME_РасходыСтатьяРасходовПриИзменении(Эл)
ЭтаФорма.Элементы.Расходы.ТекущаяСтрока = Эл.ПолучитьИдентификатор();
ДоходыИРасходыКлиентСервер.СтатьяПриИзменении(ЭтаФорма, ЭтаФорма.Элементы.РасходыАналитикаРасходов);
КонецПроцедуры
Естественно, чтобы код заработал, нужно создать в расширении свою произвольную форму для документа, у меня это - ME_ФормаЗаполненияРБП.
На форме ME_ФормаЗаполненияРБП разместить реквизиты Количество, Цена, СтатьиРасходов.
Ниже привожу полный код модуля формы ME_ФормаЗаполненияРБП:
&НаКлиенте
Процедура Заполнить(Команда)
Результат = Новый Структура();
Результат.Вставить("Количество",ЭтаФорма.Количество);
Результат.Вставить("Цена",ЭтаФорма.Цена);
МассивДанных = Новый Массив;
Для каждого Строка из СтатьиРасходов Цикл
МассивДанных.Добавить(Строка.СтатьяРасходов);
КонецЦикла;
Результат.Вставить("МассивДанных",МассивДанных);
ЭтаФорма.Закрыть(Результат);
КонецПроцедуры
&НаКлиенте
Процедура Подбор(Команда)
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимВыбора", Истина);
ПараметрыОткрытия.Вставить("МножественныйВыбор", Истина);
ДополнительныеПараметры = Новый Структура;
Оповещение = Новый ОписаниеОповещения("ПодборЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОткрытьФорму("ПланВидовХарактеристик.СтатьиРасходов.Форма.ФормаВыбора",ПараметрыОткрытия, ЭтаФорма, Истина, , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаСервере
Процедура ПодборЗавершение(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Для каждого Эл из Результат Цикл
НоваяСтрока = СтатьиРасходов.Добавить();
НоваяСтрока.СтатьяРасходов = Эл.Ссылка;
НоваяСтрока.ИдентификаторСтроки = СтатьиРасходов.Индекс(НоваяСтрока)+1;
КонецЦикла;
СтатьиРасходов.Сортировать("СтатьяРасходов");
НумерацияНаСервере();
КонецПроцедуры
&НаСервере
Процедура НумерацияНаСервере()
НомерСтроки = 1;
Для каждого Строка из СтатьиРасходов Цикл
Строка.ИдентификаторСтроки = НомерСтроки;
НомерСтроки = НомерСтроки+1;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СтатьиРасходовПриИзменении(Элемент)
НумерацияНаСервере();
КонецПроцедуры
Надеюсь, статья поможет начинающим программистам.
Вступайте в нашу телеграмм-группу Инфостарт