Не ошибусь, если скажу, что у каждого, кто долгое время занимается разработкой программного кода, появляется набор приемов, решений и заготовок, которые значительно облегчают жизнь и по этой причине, активно используются своим создателем. Я не являюсь исключением и хочу поделиться некоторыми полезными, с моей точки зрения, решениями. А началось все еще с платформы 7.7. Одно время мне пришлось поддерживать и дорабатывать конфигурацию, которая была построена на компоненте Бухгалтерский учет. При кодировании я столкнулся с необходимостью постоянно править участки программы, которые отвечали за присвоение значений субконто счета, например при формировании проводок документа в модуле проведения. Изначально в конфигурации присутствовала процедура, которая заполняла параметры проводки. Список аргументов этой процедуры представлен в следующем списке:
..........................................................................
Отсчитывать нужную позицию, в которой располагается изменяемый аргумент, крайне неудобно. Решение было найдено в использовании объекта Список Значений. Давайте сформируем список значений, для которого пара ключ-значение будет представлять собой сочетание имени субконто и его значения. На встроенном языке семерки это выглядело так.
Список=СоздатьОбъект("СписокЗначений"); Список.Установить("Контрагент",Контрагент); Список.Установить("Договор",Договор);
Теперь задача состоит в том, чтобы заполнить значения субконто проводки на основании сформированного списка. Ниже приводится пример кода.
Для н=1 по Список.РазмерСписка() цикл Знч=Список.ПолучитьЗначение(н,имя); Вид_субк=ВидыСубконто.ЗначениеПоИдентификатору(имя); Конт.Операция.Дебет.Субконто(вид_субк,знч); Конеццикла;
Что примечательно в 1С:Предприятии 7.7 , если счет не имеет субконто, найденного по идентификатору, то присвоение Операция.Дебет.Субконто(вид_субк,знч) не будет вызывать ошибки. В результате изложенного подхода мы смогли заменить весь список аргументов для указания значения субконто двумя - СписокСубконтоДт и СписокСубконтоКт. В первый мы заносим значения субконто для дебета,во второй для кредита. Если нам требуется изменить значение субконто, мы используем код СписокСубконто...Установить(<ИмяСубконто>,<ЗначениеСубконто>). Аналогичную методику можно применить и для 1С:Предприятие 8.2.
Вместо списка значений я использую структуру. Кроме этого применяю вспомогательную функцию
глВернутьИмяСубконто(вхСубк)
аргументом для которой является значение субконто. Код приводится ниже.
функция глВернутьИмяСубконто(вхСубк) Экспорт если вхСубк.Предопределенный тогда мета= ПланыВидовХарактеристик[вхСубк.Метаданные().Имя]; возврат мета.ПолучитьИмяПредопределенного(вхСубк); иначе возврат вхСубк.Наименование; конецесли; конецфункции //------------------------------------------------------------------------------------------------------- вхСубкДт=новый Структруа("Контрагенты,Договоры",Контрагент,Договор); проводка=вхДокумент.Движения.Хозрасчентный.Добавить(); н=0; для каждого знч из вхСчДт.ВидыСубконто цикл н=н+1; субк=знч.ВидСубконто; имя=глВернутьИмяСубконто(субк); если вхСубкДт.Свойство(имя,ЗнчСубк) тогда вхДвижение.СубконтоДт.Вставить(субк,ЗнчСубк); иначеесли вхСубкДт.Свойство("Субконто"+сокрЛП(н),ЗнчСубк) тогда вхДвижение.СубконтоДт.Вставить(субк,ЗнчСубк) конецесли; конеццикла;
Небольшое пояснение. Мы перебираем все субконто счета, внутри цикла определяем имя субконто, смотрим, есть ли запись с данным именем в структуре со значениями субконто, если есть, то присваиваем значение субконто в проводке, если нет, то проверяем на наличие в структуре вхСчДт записи с ключом «Субконто<НомерСубконто>».
Подведем итог. Если заполнение параметров проводки вынесено в отдельную функцию, то в качестве аргументов такой функции удобно использовать список значений в семерке или структуру в восьмой версии 1С:Предприятие.