Имя: Пароль:
1C
1C 7.7
v7: 7.7: помогите вспомнить вывод остатков регистра
0 21stas
 
04.07.26
08:15
Помогите вспомнить как вывести остатки регистра на нужную дату в макет.
Делаю перенос данных из 1С7 в 1С8.
Остатки точно есть - я их могу посмотреть универсальной обработкой. Но мне понадобилось из измерения Партия (который типа "Документ") выводить реквизиты документы - сижу, пишу программный код. Достал из архива Yellow tutor - по нему не могу сделать.
Написанный мной программный код запускается, но в макет выводит только шапку.

Процедура Сформировать()
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Остатки");
    
    ОблШапка  = Таб.ПолучитьСекцию("Шапка");          
    ОблСтрока = Таб.ПолучитьСекцию("Строка");
    
    Таб.ВывестиСекцию(ОблШапка);

    РегТМЦ = СоздатьОбъект("Регистр.ОстаткиТМЦ");
    РегТМЦ.ВременныйРасчет(1);
    ДатаОстатков = Дата(2025, 12, 31);
    РассчитатьРегистрыНа(ДатаОстатков);
    РегТМЦ.ВыбратьИтоги();

    Пока РегТМЦ.ПолучитьИтог()=1 Цикл
        ОблСтрока.Параметры.Счет=РегТМЦ.Счет;
        Таб.ВывестиСекцию(ОблСтрока);
    КонецЦикла;

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Остатки по регистру ОстаткиТМЦ на 31.12.2025");
КонецПроцедуры
1 Волшебник
 
04.07.26
07:46
вайбкодите?
2 21stas
 
04.07.26
07:52
(1) Изначально пробовал с помощью ИИ накидать - получилась полная фигня.
Поэтому начал читать описания, переделывать.
То, что сейчас в топике - это уже мой осознанный код. От ИИ остались только хвостики, которые я понял, с которыми согласен.

Основная выборка остатков по регистру написана руками с помощью Yellow tutor.
3 21stas
 
04.07.26
07:53
На 1С 7.7 когда-то хорошо писал, некоторые принципы помню.
Но о-о-очень давно.
4 Волшебник
 
04.07.26
08:00
запускается?
5 21stas
 
04.07.26
08:15
Запускается, но в макет выводит только шапку.

И выдаёт ошибки:
Счет<<?>>
Переменная не определена (Счет)
ТМЦ<<?>>
Переменная не определена (ТМЦ)
Склад<<?>>
Переменная не определена (Склад)
НДС<<?>>
Переменная не определена (НДС)
Партия<<?>>
Переменная не определена (Партия)
Количество<<?>>
Переменная не определена (Количество)
Сумма<<?>>
Переменная не определена (Сумма)
6 АгентБезопасной Нацио
 
04.07.26
10:07
Феерично...
Вы искренне считаете, что в 8.3 эти переменные были бы определены?
7 Волшебник
 
04.07.26
10:32
(5) Хорошо, что запускается.
8 Злопчинский
 
04.07.26
12:56
(0) На и По !!!
9 Злопчинский
 
04.07.26
13:14
Набежали, живодеры...
10 Злопчинский
 
04.07.26
13:15
Процедура Сформировать()

    ДатаОстатков = Дата(2025, 12, 31); // НА - начало, ПО - конец, на!
    
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Остатки");
    Таб.ВывестиСекцию("Шапка");

    РегТМЦ = СоздатьОбъект("Регистр.ОстаткиТМЦ");
    РегТМЦ.ВременныйРасчет(1);

    РассчитатьРегистрыПо(ДатаОстатков); // ПО!!!
    РегТМЦ.ВыбратьИтоги();

    Пока РегТМЦ.ПолучитьИтог()=1 Цикл
        //{--- определить переменные вывода -----------------------
        ИзмерениеХ = РегТМЦ.ИзмерениеХ; // измерениеХ - указано как выражение в ячеке Макета
        РесурсХ = РегТМЦ.РесурсХ; // РесурсХ - аналогично
        ИзмерениеХРеквизитКакойТо = РегТМЦ.ИзмерениеХ.РеквизитКакойТо; // аналогично
        //}--- определить переменные вывода -----------------------
        Таб.ВывестиСекцию("Строка");
        Сообщить(""+РегТМЦ.Номенклатура+" "+РегТМЦ.Количество);
    КонецЦикла;

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Остатки по регистру ОстаткиТМЦ на "+(ДатаОстатков+1)); // ПО и НА !!!!
КонецПроцедуры
11 Злопчинский
 
04.07.26
14:00
Кстати, ставлю на то, что в сабже - регистр не закрыт, настораживает измерение "Счет"... Как рухнет база - стучитесь...
12 Олдж
 
04.07.26
21:36
(11) кстати, а чем отличается конструкция
РегТМЦ = СоздатьОбъект("Регистр.ОстаткиТМЦ");
    РегТМЦ.ВременныйРасчет(1);

от
Рег = СоздатьОбъект("Регистры");
    РегТМЦ = Рег.ОстаткиТМЦ;
    РегТМЦ.ВременныйРасчет(1);


?
В типовых обычно второй вариант
13 Guk
 
04.07.26
22:51
(12) ничем...
14 Злопчинский
 
05.07.26
01:13
(12) В части проведенного кода - ничем.
в части неприведенного кода (то что в типовой пониже идет, а именно объект, к которому применяется РассчитатьРегистрыНа/По) - есть отличия
15 21stas
 
06.07.26
05:50
(10) Огромное спасибо, всё заработало.
16 21stas
 
06.07.26
05:51
(11) Жутко любопытно - а что такое "Регистр не закрыт"?
17 21stas
 
06.07.26
07:06
(10) А можно ещё сильно-сильно попросить аналогичный код по бухгалтерским итогам?
Мне ещё надо выгрузить остатки (сальдо) по нескольким счетам бухгалтерского учёта, со всеми субконто.
18 MWWRuza
 
гуру
06.07.26
08:56
(16) Жутко любопытно - а что такое "Регистр не закрыт"?

Регистры в 1С состоят из двух таблиц.
Остатки и обороты.
В обороты пишется "каждый чих", любое движение по всем (которые вы указали в процедурах проведения) измерениям регистра.
А в остатки, переносятся остатки по этому-же регистру, так-же по всем измерениям, на конец каждого периода выбранной периодичности регистров.
И, если по всем измерениям регистра прошли движения "и туда и обратно", на одинаковое количество/сумму, то остатки по нему обнуляются, для всех участвовавшем в этом измерений.
В результате, в регистре остатков записи на конец периода не переносятся.
А вот если по каким-то измерениям не выполнено движение "обратное", то регистр остается "не закрытым" и по этим измерениям он переносится в регистр остатков, не смотря на то, что в целом по регистру, по основным его измерениям, остаток будет нулевой.
В результате чего, таблица остатков "пухнет как на дрозжах", остатки по не закрытым измерениям переносятся из периода в период, и размер его таблиц может в несколько раз превысить размер таблиц движений этого-же регистра.
Что в конечном итоге сильно замедляет работу базы и может даже привести к ее падению.
Вот немного утрированно, но примерно так.
19 21stas
 
06.07.26
10:34
(18) Надеюсь, что я переведу предприятие на 1С8 раньше, чем распухание таблиц станет проблему. Тем более что предприятие не один десяток лет работает на 1С7.
20 Злопчинский
 
06.07.26
11:16
(17) я для выгрузки и быстрых отчетов делаю Рег.ВыгрузитьИтоги(ТЗ);
глПечатьТЗ(ТЗ); // плоская печать
и все... ибо нефиг маяться выводом
21 Злопчинский
 
06.07.26
11:24
(19) это смотря какой формат базы. Если скуль - то поживет и с незакрытыми регистрами (просто некоторые отчеты могут тормозить), если DBF - смотри размер самого большого регистра  (по маске RG*.dbf) - если в районе 1.7ГБ - готовь эггс... Очередное открытие месяца приведет к кирдыку...
А так как есть и бухкомпонента - то и таблица проводок и отборов по счетам может быть очень пухлый, на грани...
.
я вон в конце прошлого года - "сворачивал" базу как раз аналогичную. базе лет 15, регистр незакрыт, хорошо что глянул походя при очередной задачке... Пришлось хирургически "сбоку" вырезать аппендикс лапроскопически
22 Злопчинский
 
06.07.26
11:21
(17) не, на этом мое бескорыстие заканчивается ;-) бо бухкомпоненту я не настолько наблатыкался, чтобы на ходу писать без думания....
23 Климов Сергей
 
06.07.26
11:33
(21) Был у меня клиент, попал в такую ситуацию. Для него приемлемым выходом оказалось удаление таблицы rg_чего-то-там. Остатки их не волновали...
24 Злопчинский
 
06.07.26
11:37
(23) обычно безболезненно можно таблицы книги продаж и покупок удалить (в типовой ТиС при типовом учете), мало кто КПр/КПк строит в оперативной базе, и эти регистры вечно ползут незакрытые.
25 Fedor-1971
 
06.07.26
11:40
(17) Примерно так:
Ит=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
БухИтоги.ВключатьСубсчета(-1,-1);

стрСчетов = СокрЛП(Параметры.СтрокаВыборкиСчетов);
Если стрСчетов = "" тогда
	стрСчетов = "10";
КонецЕсли;
БухИтоги.ВыполнитьЗапрос(,ДатаОкончания, стрСчетов); // выбираем 10 счет

БухИтоги.ВыбратьСчета(1,0,0,1);
Пока БухИтоги.ПолучитьСчет(0)=1 цикл
    Сч=БухИтоги.Счет;
    колСубконто = Сч.КоличествоСубконто();
    Если колСубконто = 0 тогда
      сумма = БухИтоги.СКД();
       // т.е. остатки без субконто
    Иначе
		Для к=1 по колСубконто цикл
			Ит.ИспользоватьСубконто(Сч.ВидСубконто(к),,1,0);
		КонецЦикла;
		Ит.ВыполнитьЗапрос(,ДатаОкончания, Сч,,,,,7);
		Если Сч.Валютный = 1 тогда
			Ит.ВыбратьВалюты();
			Пока Ит.ПолучитьВалюту() = 1 цикл
		    	 // ткт перебираем субконто в разрезе валют
			КонецЦикла;
			
	    Иначе
	    	Пока Ит.ПолучитьСубконто(1)=1 цикл
		   Если Сч.КоличествоСубконто()>1 тогда
			Если Ит.ВыбратьСубконто(2) = 0 тогда //типа оборотное субконто
                        Иначе
                          Пока Ит.ПолучитьСубконто(2)=1 цикл
                           сумма = Ит.СКК();
                          КонецЦикла; 
                        КонецЕсли;
	    КонецЕсли;
    КонецЕсли;
КонецЦикла;
26 Олдж
 
06.07.26
12:04
(17) загляни во внешнюю обработку в типовой бухгалтерии 7.7 WRAP.ert
27 AAA
 
06.07.26
12:24
Если бы когда то хорошо писал, то руки бы помнили ) И на незакрытые регистры время не властно
И зачем в переносимые остатки из партий что-то доставать ? в 8-ке документом партии будет сам документ начальных остатков
28 Fedor-1971
 
06.07.26
12:37
(27) Не всегда, в БП, ввод остатков делает новый документ Партия
29 Злопчинский
 
06.07.26
12:40
(27) Мимо! ;-)
В переносимые - вполне возможно наплевать на партии.
Незакрытые обычно - Взаиморасчеты, Остатки - рядовая ситуация когда интеркампани (которую из "лавочников") никто не реализует, а контроль "по компании", и на переносе встает вопрос - " в у кого скока-скока?"
30 Злопчинский
 
06.07.26
12:41
(25) не забыть возможно еще и разворот по валютам для валютных счетов.
31 Fedor-1971
 
06.07.26
12:48
(30) я его и нарисовал Если Сч.Валютный = 1 тогда - т.е. перебираем валюты, потом субконто
32 uno-group
 
06.07.26
12:50
В 7.7 в конфигураторе Конструктор Запрос и Бухгалтерский запрос вполне сносно работают и требуют минимальных знаний 1с.
33 AAA
 
06.07.26
13:06
(28)но его не надо тащить из старой программы
34 Fedor-1971
 
06.07.26
14:42
(33) в общем случае - да, но, если очень хочется/надо сохранить номера партий, то - можно просто создать документ Партия с нужным ТМЦ, номером и датой
35 21stas
 
06.07.26
19:30
(25) Дописал. Заработало. Огромное спасибо.

    ДатаОстатков = Дата(2025, 12, 31); // НА - начало, ПО - конец, на!
    
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Остатки");
    Таб.ВывестиСекцию("Шапка");
    
    Ит=СоздатьОбъект("БухгалтерскиеИтоги");
    БухИтоги=СоздатьОбъект("БухгалтерскиеИтоги");
    БухИтоги.ВключатьСубсчета(-1,0);
    БухИтоги.ВыполнитьЗапрос(,ДатаОстатков, "60");
    
    ИтогоСуммаДт=0;
    ИтогоСуммаКт=0;
    
    БухИтоги.ВыбратьСчета(1);
    Пока БухИтоги.ПолучитьСчет(0)=1 цикл
        Счет=БухИтоги.Счет;
        //Сообщить(Счет);
        колСубконто = Счет.КоличествоСубконто();
        Для к=1 по колСубконто Цикл
            Ит.ИспользоватьСубконто(Счет.ВидСубконто(к),,1,0);
        КонецЦикла;
        Ит.ВыполнитьЗапрос(,ДатаОстатков, Счет,,,,,7);
        Ит.ВыбратьСубконто(1);
        Пока Ит.ПолучитьСубконто(1)=1 цикл  
            Ит.ВыбратьСубконто(2);
            Пока Ит.ПолучитьСубконто(2)=1 цикл
                Субконто1=Ит.Субконто(1);
                Субконто2=Ит.Субконто(2);
                
                Попытка
                    Договор=Ит.Субконто(2).Договор;
                    НомерДоговора=Договор.Наименование;
                    ДатаДоговора=Договор.ДатаДоговора;
                    НомерСчФ=Ит.Субконто(2).НомерСчетаФактуры;
                    ДатаСчФ=Ит.Субконто(2).ДатаДок;
                Исключение
                КонецПопытки;
                СуммаДт = Ит.СКД();
                СуммаКт = Ит.СКК();
                ИтогоСуммаДт=ИтогоСуммаДт+СуммаДт;
                ИтогоСуммаКт=ИтогоСуммаДт+СуммаКт;
                //Количество = Ит.СКД(3); //Количество
                Таб.ВывестиСекцию("Строка");
            КонецЦикла;
        КонецЦикла;    
    КонецЦикла;