Нетабличная часть, или Как я провел выходные

Публикация № 1330500

Администрирование - Администрирование данных 1С - Обработка документов

групповое изменение операция бухгалтерская БГУ

Групповое изменение полей таблицы документа "Операция (бухгалтерская)" в конфигурации БГУ 2.0, созданного без использования типовых операций. Разработка выполнена на платформе 8.3.13.1644, БГУ 2.0.68.18, протестирована и применена на платформе 8.3.18.1128, БГУ 2.0.74.35.

Однажды у коллег возникла проблема. На первый взгляд, пустяк, да и только. Всего-то поменять счет дебета и одно субконто в отдельно взятом документе "Операция (бухгалтерская)". Это в конфигурации "Бухгалтерия государственного учреждения 2.0".

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

Разумеется, каждый, к кому обращались за советом, тут же принимался искать групповое изменение реквизитов. Ну, и я тоже. Понятно ведь, что коллеги слегка затупили, но я-то самый умный. Обычно я туплю по другим вопросам, а с этим – ща разберемся.

Ага, разобрались… В контекстном меню даже пункта такого нет. Захожу через Администрирование – обработка не видит табличную часть. Загружаю внешнюю обработку – и та не видит. Как вы догадываетесь, то же самое наблюдали все остальные.

И вот тут до нас дошло, что арифметика совсем не в нашу пользу. Проблемных строчек по-прежнему восемьсот, а подходящих инструментов – ни одного.

Секрет, в общем-то, прост – нет там никакой табличной части. Вместо нее документ показывает регистр бухгалтерии ЖурналПроводокЕПСБУ. А чтобы мало не показалось, регистр, в свою очередь, подсовывает виртуальную таблицу ДвиженияССубконто. А иначе никаких субконто мы вообще не увидим.

Все желающие могут полюбоваться на это безобразие в конструкторе запросов. Уверен, вам понравится. Если хотите увидеть субконто, правильный подход выглядит примерно так:

ВЫБРАТЬ
        Таб.НомерСтроки КАК НомерСтроки,
        Таб.СчетДт КАК СчетДт,
        Таб.СубконтоДт1 КАК СубконтоДт1,
        Таб.СубконтоДт2 КАК СубконтоДт2,
        Таб.СубконтоДт3 КАК СубконтоДт3,
        Таб.СчетКт КАК СчетКт,
        Таб.СубконтоКт1 КАК СубконтоКт1,
        Таб.СубконтоКт2 КАК СубконтоКт2,
        Таб.СубконтоКт3 КАК СубконтоКт3
ИЗ
        РегистрБухгалтерии.ЖурналПроводокЕПСБУ.ДвиженияССубконто КАК Таб
ГДЕ
        Таб.Регистратор.Ссылка = &Ссылка

где в качестве параметра Ссылка может выступать чуть ли не половина документов, существующих в конфигурации. Например, та же "Операция (бухгалтерская)".

Ну так вот, получается, что пока документ не откроет свою форму, он даже сам не знает, как много интересного в нем написано. А заодно и всякие полезные обработки ничего об этом не знают, они ведь тоже на форму не смотрят.

В общем-то, на этом месте можно было развести руками. Мол, "ну, не шмогла". Однако ж, восемьсот строчек смотрели на меня с ухмылкой и укоризной: "Какой ты, нахрен, программист после этого? Восемьсот раз не можешь сделать одно и то же. Разве не этому тебя учили на втором занятии по Бейсику?"

Так-то оно так, вот только в Бейсике не было регистра бухгалтерии. Особенно когда я его учил.

К счастью, проблема возникла в пятницу. На улице мороз, пандемия, все ходят в масках и меня заставляют. Короче, пока вы там все в масках свежим воздухом дышите, я лучше дома посижу, полезный инструмент склепаю. Пусть это будет мой личный хакатон. Глядишь, еще и статью напишу.

Собственно, вот и статья, а в конце – то, что получилось. Комплект состоит из расширения и внешней обработки. Расширение готовит почву для обработки, но без нее никто не отредактирует документы шаловливыми ручками. Поэтому и не стал делать все в одной компоненте. Вы можете поступать, как считаете нужным.

У расширения задан режим совместимости с 8.3.12. Просто дома я работаю на учебной версии платформы 8.3.13.1644, поэтому пришлось развернуть демобазу БГУ 2.0 примерно полугодовой давности. Когда притащил готовый результат на работу, более свежая платформа сама предложила поменять совместимость на 8.3.14.

Поскольку обратный переход не предусмотрен, здесь прилагается домашний вариант, то есть совместимый с 8.3.12.

Расширение здесь нужно только ради одного – выполнить действия, предусмотренные при изменении полей таблицы. А для этого нужны экспортные процедуры, живущие в модуле формы документа. Я даже не стал переназначать обработчики. Просто скопировал их в расширение и слегка поправил, как мне надо. То есть у меня это и не обработчики, и не их расширения, хотя очень похожи.

Догадываюсь, что такой подход вызовет критику, но для эпизодического применения и так сойдет. Впрочем, критика ожидается и принимается, как и полезные советы.

Кстати, в связи с расширением хотелось бы передать отдельный привет разработчикам БГУ. Ну, не считая тех приветов, которые мы регулярно посылаем в рабочее время. Вслух и мысленно.

Вот, к примеру, смотрю я модуль формы документа, и вроде бы, все хорошо. Обработчики события ПриИзменении у полей таблицы очень приятно выглядят. Например, у полей СчетДт / СчетКт они смотрят на своей форме выделенную строку, а потом вызывают из общего модуля процедуру СубконтоПриИзменении() и передают ей только поле таблицы. Отлично, поправлю их так, чтобы смотрели в мои строчки, и готово.

А для всех шести полей Субконто... обработчики вообще одинаковые и удивительно лаконичные:

&НаКлиенте
Процедура ДвиженияЖурналПроводокСубконтоДт1ПриИзменении(Элемент)
        БухгалтерскиеОперацииКлиент.СубконтоПриИзменении(Элемент,,, Истина);
КонецПроцедуры

Все та же СубконтоПриИзменении() с полем таблицы. Вообще ничего делать не надо.

Оказалось, что надо. Мне как-то в голову не приходило, что где-то дальше, за пределами формы, заново прочитывается строка, выделенная пользователем. Вот как раз в процедуре общего модуля то самое и происходит. Прям так, посреди процедуры:

Общий модуль БухгалтерскиеОперацииКлиент

Процедура СубконтоПриИзменении(Элемент, Знач ПрефиксСубконтоДанных = "", 
        Знач СтруктураИменСубконто = Неопределено, УстанавливатьКЭК = Ложь) Экспорт
        
        Таблица = БухгалтерскиеОперацииКлиентСервер.ПолучитьРодителяПоТипуЭлемента(Элемент, Тип("ТаблицаФормы"));
        Форма = БухгалтерскиеОперацииКлиентСервер.ПолучитьРодителяПоТипуЭлемента(Элемент, Тип("УправляемаяФорма"));
…
        ТекущиеДанные = Таблица.ТекущиеДанные;
…

КонецПроцедуры

Красота. Форму и таблицу узнают по переданному параметру, а текущую строку – просто глядя на форму. И ведь нет у процедуры ни одного параметра, чтобы передать строку при вызове. Так что и в расширении через параметры не передашь. Ну вот зачем так делать?

Можете не объяснять, я догадываюсь. 1С не всегда думает обо мне. Пришлось в расширении создать реквизит формы и туда класть строку, а заодно притащить процедуру общего модуля и слегка поправить. Как раз там, посреди процедуры.

Все грабли, по которым я прошелся на выходных, перечислять не буду. Главное, что инструмент готов и решает поставленную задачу. Теперь мне не стыдно смотреть на восемьсот вредных строчек. Пусть боятся.

Скачать файлы

Наименование Файл Версия Размер
ИсправлениеОперацияБухгалтерскаяБГУ20.zip

.zip 41,74Kb
21.11.20
1
.zip 41,74Kb 1 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. gubanoff 50 24.11.20 12:11 Сейчас в теме
С таким же успехом можно было autoit запустить, чтобы нащелкал строчки за вас.
2. AnatolPopov 73 24.11.20 13:11 Сейчас в теме
(1) Опасаюсь я таких инструментов. Неизвестно, чего он там нащелкает.

А кроме того, цель была - дать инструмент коллегам, которые больше бухгалтера, чем программисты или админы. То есть понятную обработку с понятными полями и кнопками.
3. dfgdsfgsdfg2011 25.11.20 17:43 Сейчас в теме
Теперь мне не стыдно смотреть на восемьсот вредных строчек
- ахахаха
В условные 10 строк можно было программно поменять значения счета и субконто в движениях по регистру
4. AnatolPopov 73 25.11.20 18:42 Сейчас в теме
(3) До недавнего времени я не имел дела с регистром бухгалтерии. Так что не стал соваться в него. Решил, что проще запустить исправления через ту же дверь, куда обычно идут данные, а дальше их проводят.

Кстати, с удовольствием посмотрю на "условные 10 строк" в виде готовой обработки. Или просто в виде строк.

Задача, конечно, специфическая и, надеюсь, редкая, но неплохо так размялся ;)
5. dfgdsfgsdfg2011 26.11.20 16:17 Сейчас в теме
	Счет10960 = БухгалтерскиеОперации.СчетПоКоду("109.60", ТекущаяДата());
	
	НаборЗаписей = РегистрыБухгалтерии.ЖурналПроводокЕПСБУ.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Регистратор.Установить(Объект.ОперацияБух);
	НаборЗаписей.Прочитать();
	Если НаборЗаписей.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	 Для Каждого Запись Из НаборЗаписей Цикл
	  Если Запись.СчетДт = Счет10960 И Запись.СчетКт = Счет10960 Тогда
	  
		  ЕСли Запись.КПСДт = Объект.СтарыйКПС Тогда
	    	    Запись.КПСДт = Объект.НовыйКПС;
	      КонецЕсли;	  
	    	
	  КонецЕсли;
	  
  КонецЦикла;	  
	  
  НаборЗаписей.Записать();	
Показать
6. AnatolPopov 73 26.11.20 16:58 Сейчас в теме
(5) Два вопроса

Можно ли так же безнаказанно поменять сами счета?

Как насчет субконто?
7. dfgdsfgsdfg2011 26.11.20 18:16 Сейчас в теме
(6)
конечно можно
Запись.СчетКт             = Счет20531;
			  Запись.КПСКт				= СтрокаТЧ.КПС;
			  Запись.КЭККт   			= КОСГУ667;
			  Запись.СубконтоКт.Контрагенты = СтрокаТЧ.Контрагент;
			  Запись.СубконтоКт.Договоры= СтрокаТЧ.Договор;
8. AnatolPopov 73 26.11.20 19:32 Сейчас в теме
(7) Насчет последних двух строк. Когда я посмотрел, что за поля у регистра бухгалтерии, решил, что ну его нафиг. Особенно с субконто. Вообще не понял, что там за дебри такие.

Теперь вижу, что к полям Субконто требуется некоторый обвес. То есть смотрим, какой тип данных назначен для конкретного субконто, и шагаем дальше по полям.

Я ведь делал инструмент прежде всего для бухгалтера. То есть чтобы можно было из списка корректно выбрать, что заменить и на что заменить соответственно настройкам счета. Чтобы руками не лазить и циферки не путать.

В итоге получается, что ваше решение позволяет отказаться от обработчиков события ПриИзменении, потому что не трогаем форму. Значит, не нужно расширение. А все остальное, что касается интерфейса, остается.

Будет время - сделаю другой вариант обработки, который может с колес работать. Спасибо!
Оставьте свое сообщение

См. также

daСклонение: склонение ФИО, должностей, чисел, прилагательных, существительных на языке 1С + ТестЦентр Промо

Универсальные функции v8 1cv8.cf Абонемент ($m)

Функция предназначена для склонения выражений, которые часто требуется при формировании печатных форм договоров и прочих печатных форм. Функция склоняет по падежам ФИО, должности, числительные, валюты, единицы измерения, предметы. Также функция склоняет глаголы и прилагательные по числам и родам и существительные по числам. Имеется режим определения рода переданного выражения. Поддержка форматной строки для вывода результата. Функция не использует внешние библиотеки и веб-сервисы, написана на чистом языке 1С, и поэтому легко встраивается в любую конфигурацию или внешнюю обработку. Правила склонения оформлены в виде таблицы и могут быть легко изменены при необходимости.

1 стартмани

14.02.2015    105594    99    daMaster    90    

Сравнение реального дохода со средним доходом из API.HH.RU

Зарплата Управленческие v8 v8::СПР ЗУП3.x УУ Абонемент ($m)

Внешняя обработка на управляемой форме для 1С:Предприятие 8.3 по интеграции с HH.RU используя HH REST API. Ключевые функции: получение списка вакансий по должностям (Ключ для работы не нужен); расчет среднего дохода; Тестирование проводилось на платформе 1С:Предприятие 8.3 (8.3.13.1513) Зарплата и управление персоналом, редакция 3.1 (3.1.11.68) совместно с API.HH.RU.

1 стартмани

11.11.2019    4506    7    solaru    2    

Конфигурация для рекламного агентства

Управление услугами и сервисом Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) Управление взаимоотношениями с клиентами (СRM) Производство готовой продукции (работ, услуг) v8 Реклама, PR и маркетинг УУ Абонемент ($m)

Данная конфигурация выполнена для решения тестового задания: Цель задания: 1) Понять, на каком из клиентов сколько мы заработали;  2) Понять, по какому виду СМИ сколько мы заработали;  3) Проследить по каждой услуге: у кого за сколько купили и кому за сколько продали, с возможностью перейти в соответствующий документ. Реализовано с помощью: 1. Справочники - контрагенты, номенклатура 2. Документы - Поступление услуг, реализация услуг 3. Отчеты - отчет по контрагентам, номенклатуре и движений.

1 стартмани

21.05.2019    5608    0    solaru    0    

Загрузка номенклатуры в УТ 10.3 из Excel файла с генерацией штрихкодов

Загрузка и выгрузка в Excel Обработка справочников Оптовая торговля Розничная торговля Учет ТМЦ Оптовая торговля Розничная торговля Учет ТМЦ v8 УТ10 Россия Абонемент ($m)

Обработка позволяет генерировать новые номенклатурные позиции на основе данных из файла Excel с последующей генерацией штрихкодов (ШК). Может быть полезна при больших поступлениях товаров на склад, где ручное создание и присваивание штрихкода  (ШК) может занимать много времени.

1 стартмани

24.03.2017    8307    7    solaru    0    

Под капотом управляемых форм

Практика программирования v8 1cv8.cf Бесплатно (free)

Управляемые формы уже давно и плотно вошли в жизнь 1С-разработчика. Однако, судя по недавним публикациям на Инфостарте, многие до сих пор мало знакомы с ними. Предлагаю разобраться с тем, что же это такое.

26.08.2013    272175    Evil Beaver    271    

[NotaBene] Универсальный отчет по таблице значений

Практика программирования v7.7 1cv7.md Россия Абонемент ($m)

1C v.7.7 Готовое решение. Не требует настройки. Не требует допрограммирования. Данная обработка решает часто встречающуюся задачу вывода в "красивом" виде таблицы значений (полученной, например, из запроса). Поддерживается произвольное группирование данных, отключение/включение группировок, в т.ч и создание "шахматок" (типа "продажи понедельно"). Обработка может использоваться как и в отладочных целях (для нормального просмотра ТЗ), так и в составе вполне рабочих отчетов. По крайней мере, я неоднократно клиентам данную обработку ставил вместо того, чтобы каждый раз писать замороченные выводы данных. И клиенты довольны, и мне - проще...

2 стартмани

07.05.2007    29725    5    CheBurator    63