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

02.12.20

Задачи пользователя - Адаптация типовых решений

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

Скачать исходный код

Наименование Файл Версия Размер
ИсправлениеОперацияБухгалтерскаяБГУ20.zip
.zip 42,83Kb
10
.zip 42,83Kb 10 Скачать
ИсправлениеОперацияБухгалтерскаяБГУ20Регистр.epf
.epf 10,91Kb
3
.epf 10,91Kb 3 Скачать

Однажды у коллег возникла проблема. На первый взгляд, пустяк, да и только. Всего-то поменять счет дебета и одно субконто в отдельно взятом документе "Операция (бухгалтерская)". Это в конфигурации "Бухгалтерия государственного учреждения 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С не всегда думает обо мне. Пришлось в расширении создать реквизит формы и туда класть строку, а заодно притащить процедуру общего модуля и слегка поправить. Как раз там, посреди процедуры.

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

Дополнение. О правильном подходе

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

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

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

Здесь необходимо отметить принципиальную разницу в подходах к задаче. В первом варианте (с расширением) исправления делаются на форме документа, но в базу не вносятся, пока пользователь не нажмет "Записать и закрыть". При этом сначала можно исправить одни поля, потом другие и так далее, а потом уже сохранить все изменения сразу. А главное, пользователь видит реакцию формы на исправления и таким образом получает подсказки.

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

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

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

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

Второй вариант опубликован для желающих посмотреть на реализацию замечаний из комментариев. Но форма обработки по-прежнему предполагает исправление только одного поля, о чем сказано в предупреждающей надписи.

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

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4610    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3038    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1648    dimanich70    8    

14

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    2090    19    avmartynov    12    

44

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2197    24    progmaster    7    

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

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

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

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

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

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

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

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

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

Будет время - сделаю другой вариант обработки, который может с колес работать. Спасибо!
9. AnatolPopov 167 02.12.20 14:01 Сейчас в теме
(7) Извините за настырность, но я сделал вариант с регистром. И выяснилось, что первый вариант совсем не так плох, как казалось раньше. См. дополнение в конце статьи.
10. dfgdsfgsdfg2011 02.12.20 17:13 Сейчас в теме
(9)
Не смотрел вашу обработку, но типы субконто можно приводить через "СвязьПоТипу" https://its.1c.ru/db/metod8dev/content/2876/
Если нужна универсальность, то можно посмотреть реализацию в справочниках и документах где вызывается "БухгалтерскийУчетКлиентСервер.УстановитьЗаголовкиИДоступностьСубконто"
12. AnatolPopov 167 02.12.20 20:35 Сейчас в теме
(10) Спасибо, связь по типу используется на форме обработки. Новые значения выбираются в зависимости от типа значения, которое нужно заменить.

А речь шла о том, что поля вроде номера счета (наверно, только эти?) требуют изменения ещё нескольких полей. И если работать непосредственно с регистром, то делать это надо одновременно. А значит, выбирать и вводить кучу значений сразу. При работе с формой документа это можно разложить на сколько угодно шагов, причём каждый контролировать. Несомненно, это гораздо комфортнее для пользователя.
11. пользователь 02.12.20 17:13
Сообщение было скрыто модератором.
...
Оставьте свое сообщение