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

02.12.20

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
ИсправлениеОперацияБухгалтерскаяБГУ20.zip
.zip 42,83Kb
10
10
1 SM
Скачать Купить за 1 850 руб.
ИсправлениеОперацияБухгалтерскаяБГУ20Регистр.epf
.epf 10,91Kb
3
3
1 SM
Скачать Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

29400 руб.

29.06.2023    5110    11    5    

20

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

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

7200 руб.

02.08.2023    3486    8    0    

26

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

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    4690    dimanich70    15    

20

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

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

01.03.2024    3431    dimanich70    8    

15

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

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

1 стартмани

27.10.2023    2722    21    avmartynov    14    

53

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

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

2 стартмани

22.08.2023    2809    43    progmaster    8    

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

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

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

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

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

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

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

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

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

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

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