|
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); //Количество Таб.ВывестиСекцию("Строка"); КонецЦикла; КонецЦикла; КонецЦикла; |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |