Нумерация колонок субконто при выгрузке набора записей регистра бухгалтерии в таблицу значений

14.01.19

Разработка - Универсальные функции

Решение проблемы несовпадения номеров колонок с номерами субконто на счете при выгрузке в таблицу значений.

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

Создает таблицу значений и копирует в нее записи набора. Структура полученной таблицы совпадает со структурой набора записей. Значения субконто выгружаются вместе с видами субконто. Для каждого субконто создается пара колонок с идентификаторами вида ВидСубконто<Номер>, Субконто<Номер>, для регистра не поддерживающего корреспонденцию, и ВидСубконтоДт<Номер>, СубконтоДт<Номер>, ВидСубконтоКт<Номер>, СубконтоКт<Номер>, для регистра поддерживающего корреспонденцию.

При этом номера <Номер> могут не совпадать с номерами видов субконто на соответствующем счете.

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

Процедура УстановитьСубконтоПоНомерам(Таблица)
	Для Каждого Строка Из Таблица Цикл
		СоответствиеСубконто=Новый Соответствие;
		Для Сч=1 По Строка.СчетКт.ВидыСубконто.Количество() Цикл
			СоответствиеСубконто.Вставить(Строка["ВидСубконтоКт"+Сч],Строка["СубконтоКт"+Сч]);
		КонецЦикла;	
		Для Сч=1 По Строка.СчетДт.ВидыСубконто.Количество() Цикл
			СоответствиеСубконто.Вставить(Строка["ВидСубконтоДт"+Сч],Строка["СубконтоДт"+Сч]);
		КонецЦикла;	
		
		
		ТаблицаСубконто = Строка.СчетДт.ВидыСубконто;
		Ном=0;
		Для Каждого ТекущаяСтрока Из ТаблицаСубконто Цикл 
			Ном=Ном+1;
			Строка["ВидСубконтоДт"+Ном]=ТекущаяСтрока.ВидСубконто;
			Строка["СубконтоДт"+Ном]=СоответствиеСубконто.Получить(ТекущаяСтрока.ВидСубконто);
		КонецЦикла; 
		
		ТаблицаСубконто = Строка.СчетКт.ВидыСубконто;
		Ном=0;
		Для Каждого ТекущаяСтрока Из ТаблицаСубконто Цикл 
			Ном=Ном+1;
			Строка["ВидСубконтоКт"+Ном]=ТекущаяСтрока.ВидСубконто;
			Строка["СубконтоКт"+Ном]=СоответствиеСубконто.Получить(ТекущаяСтрока.ВидСубконто);
		КонецЦикла; 
		
		
	КонецЦикла;	
	
КонецПроцедуры	

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4119    Abysswalker    10    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    7670    DeerCven    15    

61

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    52673    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7670    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67135    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9595    ke.92@mail.ru    17    

68
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Alex1Cnic 153 24.01.19 16:57 Сейчас в теме
Актуально... у меня такая же петрушка.....
2. asbest 27.06.19 01:52 Сейчас в теме
Огромное спасибо!
3. rava_aal 10.09.19 14:14 Сейчас в теме
4. Teruzbat 19.11.19 01:23 Сейчас в теме
5. Absatarov 84 14.02.20 08:27 Сейчас в теме
6. Merkalov 12 06.10.20 08:12 Сейчас в теме
Полчаса велосепедил, потом решил загуглить, надо было сразу гуглить, спасибо!
7. yhor 17.03.21 13:09 Сейчас в теме
Интересно, что до сих пор никто не указал, что в коде ошибка. Почему используется одна переменная СоответствиеСубконто и для Кт, и для Дт? В результате перезатирается субконто Кт данными из субконто Дт.

Процедура УстановитьСубконтоПоНомерам(Таблица)
	Для Каждого Строка Из Таблица Цикл
		СоответствиеСубконтоДт=Новый Соответствие;
		СоответствиеСубконтоКт=Новый Соответствие;
		Для Сч=1 По Строка.СчетКт.ВидыСубконто.Количество() Цикл
			СоответствиеСубконтоКт.Вставить(Строка["ВидСубконтоКт"+Сч],Строка["СубконтоКт"+Сч]);
		КонецЦикла;	
		Для Сч=1 По Строка.СчетДт.ВидыСубконто.Количество() Цикл
			СоответствиеСубконтоДт.Вставить(Строка["ВидСубконтоДт"+Сч],Строка["СубконтоДт"+Сч]);
		КонецЦикла;	
		
		
		ТаблицаСубконто = Строка.СчетДт.ВидыСубконто;
		Ном=0;
		Для Каждого ТекущаяСтрока Из ТаблицаСубконто Цикл 
			Ном=Ном+1;
			Строка["ВидСубконтоДт"+Ном]=ТекущаяСтрока.ВидСубконто;
			Строка["СубконтоДт"+Ном]=СоответствиеСубконтоДт.Получить(ТекущаяСтрока.ВидСубконто);
		КонецЦикла; 
		
		ТаблицаСубконто = Строка.СчетКт.ВидыСубконто;
		Ном=0;
		Для Каждого ТекущаяСтрока Из ТаблицаСубконто Цикл 
			Ном=Ном+1;
			Строка["ВидСубконтоКт"+Ном]=ТекущаяСтрока.ВидСубконто;
			Строка["СубконтоКт"+Ном]=СоответствиеСубконтоКт.Получить(ТекущаяСтрока.ВидСубконто);
		КонецЦикла; 
		
		
	КонецЦикла;	
	
КонецПроцедуры
Показать
NikiforovVA; van_za; igor-pn; +3 Ответить
8. The Ded 180 17.03.21 15:26 Сейчас в теме
Вы проверяли - перезатирается? Там же ключ с разным префиксом, "ВидСубконтоКт"+Сч и "ВидСубконтоДт"+Сч. Должно хорошо всё быть
9. yhor 18.03.21 12:36 Сейчас в теме
(8) Если вид субконто в Дт и в Кт совпадает, перезатирает.
10. kriswell 150 13.04.23 19:50 Сейчас в теме
Автору спасибо!

Добавлю более корректный вариант, а то обращение через точку к ссылке, да к тому же в цикле - прям нехорошо. Вот эта конструкция "Счет.ВидыСубконто" за один проход цикла выполняется 4 раза, т.е. делает 4 запроса, причем не самых оптимальных в данном случае.
Лучше переписать через БухгалтерскийУчетВызовСервераПовтИсп.БухгалтерскийУчетВызовСервераПовтИсп() или ОбщегоНазначения.ЗначениеРеквизитаОбъекта().

ТаблицаПроводки = Движения.Хозрасчетный.Выгрузить();

Для Каждого СтрокаТаблицы Из ТаблицаПроводки Цикл
	
	СвойстваСчетаДт = БухгалтерскийУчетВызовСервераПовтИсп.ПолучитьСвойстваСчета(СтрокаТаблицы.СчетДт);
	СвойстваСчетаКт = БухгалтерскийУчетВызовСервераПовтИсп.ПолучитьСвойстваСчета(СтрокаТаблицы.СчетКт);
	
	ЗначенияСубконтоДт = Новый Соответствие;
	Для НомерСубконто = 1 По СвойстваСчетаДт.КоличествоСубконто Цикл
		ЗначенияСубконтоДт.Вставить(СтрокаТаблицы["ВидСубконтоДт"+НомерСубконто], СтрокаТаблицы["СубконтоДт"+НомерСубконто]);
	КонецЦикла;
	
	ЗначенияСубконтоКт = Новый Соответствие;
	Для НомерСубконто = 1 По СвойстваСчетаКт.КоличествоСубконто Цикл
		ЗначенияСубконтоКт.Вставить(СтрокаТаблицы["ВидСубконтоКт"+НомерСубконто], СтрокаТаблицы["СубконтоКт"+НомерСубконто]);
	КонецЦикла;
	
	Для НомерСубконто = 1 По СвойстваСчетаДт.КоличествоСубконто Цикл
		СтрокаТаблицы["ВидСубконтоДт"+НомерСубконто] = СвойстваСчетаДт["ВидСубконто"+НомерСубконто];
		СтрокаТаблицы["СубконтоДт"+НомерСубконто] = ЗначенияСубконтоДт.Получить(СвойстваСчетаДт["ВидСубконто"+НомерСубконто]);
	КонецЦикла;

	Для НомерСубконто = 1 По СвойстваСчетаКт.КоличествоСубконто Цикл
		СтрокаТаблицы["ВидСубконтоКт"+НомерСубконто] = СвойстваСчетаКт["ВидСубконто"+НомерСубконто];
		СтрокаТаблицы["СубконтоКт"+НомерСубконто] = ЗначенияСубконтоКт.Получить(СвойстваСчетаКт["ВидСубконто"+НомерСубконто]);
	КонецЦикла;

КонецЦикла;
Показать
zig31; twiny; +2 Ответить
11. The Ded 180 13.04.23 19:58 Сейчас в теме
(10) Согласен, более красивый вариант, спасибо
12. German_Tagil 43 03.06.24 08:22 Сейчас в теме
спасибо подправил обработку
Для отправки сообщения требуется регистрация/авторизация