Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 13:44

определение последней записи в периодическом регистре сведений

Автор primus, 11 окт 2011, 14:06

0 Пользователей и 1 гость просматривают эту тему.

primus

Есть периодический регистр сведений Контрагенты.
Есть у меня две записи:

Период            ФИО            КоличествоЧеловек
01.01.2007  Иванов В.В.                    5
03.03.2010  Иванов В.В.                    6

Мне нужно для Иванова В.В. вывести, сколько у него на сегодняшний день проживает человек.

Иждивенцы = РегистрыСведений.Контрагенты.Выбрать();
Пока Иждивенцы.Следующий() Цикл
      Если Иждивенцы.ФИО = "Иванов В.В." Тогда
              ЭтаФорма.КоличествоИждивенцев = Иждивенцы.КоличествоЧеловек
      КонецЕсли;
КонецЦикла;

Гарантирует ли такая конструкция вывод самой последней записи для человека? 

Big Mike

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

primus

Не могу понять, что получается при использовании матода СрезПоследних.
Есть периодический регистр сведений Контрагенты с Измерениями: СТ, Село, Адрес, Дом,Квартира. Ресурсами ФИО, КоличествоЧеловек. Реквизит - НомерДоговора.

Делаю следующее:

ПолучитьДоговор = Новый Структура("СТ", "Село", "Адрес", "Дом", "Квартира");
ПолучитьДоговор.Вставить("СТ", ЭтаФорма.СТ);
ПолучитьДоговор.Вставить("Село", ЭтаФорма.Село);
ПолучитьДоговор.Вставить("Адрес",ЭтаФорма.Адрес);
ПолучитьДоговор.Вставить("Дом",ЭтаФорма.Дом);
ПолучитьДоговор.Вставить("Квартира",ЭтаФорма.Квартира);

ПроверкаДоговра = РегистрыСведений.Контрагенты.СрезПоследних(ТекущаяДата(), ПолучитьДоговор);

дальше мне надо проверить, заключен ли с ним договор.

Если ПроверкаДоговора.НомерДоговора <> 0 Тогда ЭтаФорма.НомерДоговора = ПроверкаДоговора.НомерДоговора
КонецЕсли;

при отладке пишет, что не найдено поле объекта НомерДоговора.

AntonB

Если договор не заключен, ПроверкаДоговра вернет пустую таблицу

Если ПроверкаДоговра.Количество() > 0 Тогда
   и использовать ПроверкаДоговра[0] или вообще перебирать строки
Предлагаю полный ИТ сервис небольшой организации в Москве (приходящий сисадмин+1С7.7,1С8.x)

AntonB

Предлагаю полный ИТ сервис небольшой организации в Москве (приходящий сисадмин+1С7.7,1С8.x)

has

Там таблица значений возвращается. Если уверен что запись одна, то

СтрокаТаблицы = ПроверкаДоговора[0];
Если СтрокаТаблицы.НомерДоговора <> 0 Тогда
  ЭтаФорма.НомерДоговора = СтрокаТаблицы.НомерДоговора;
КонецЕсли;

А вобще делал бы запросом.

AntonB

ПроверкаДоговра, кстати, или ПроверкаДоговора ?  у Вас по-разному написано
Предлагаю полный ИТ сервис небольшой организации в Москве (приходящий сисадмин+1С7.7,1С8.x)

primus

Регистр сведений Контрагенты хранит не только данные, но и историю их изменений.
Период         СТ          Село                Адрес       Дом   Квартира   НомерДоговора
01.01.2009   моск.обл  простоквашино  Молочная   1          1               1020
01.01.2010   моск.обл  простоквашино  Молочная   1          1               2020
01.01.2011   моск.обл  простоквашино  Молочная   1          1                 0

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

Big Mike

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

has

Цитата: primus от 12 окт 2011, 15:57
данные приблизительные. Если делать запросом выборку по одновременному равенству измерений регистра и введенных данных формы, то есть ли гарантия, что выберет в итоге последнюю запись. То есть как в примере: в этом году договор не заключался, а в предыдущие есть договор.
Это можно сделать запросом, если укажешь в запросе что нужна та запись где номер договора не равен 0, то он вернет вторую запись, т.е. где дата в примере 01.01.2010. Запросом надо пользоваться, потому что он быстрее работает. На трех записях это не заметишь конечно, а вот на 1000 и более заметно будет.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск