• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Ошибка при выводе ТЗ

  • Автор темы BBDragon
  • Дата начала
B

BBDragon

Просматриваю построчно документ (реестр) с записями, в случае отсутствия пациента в базе - заношу его в ТЗ. Сама ТЗ состоит из трех колонок - ФИО человека, дата рождения и порядковый номер записи в исходном реестре. Поскольку человек может быть записан 2 и более раз в документе, то применяю метод Свернуть, чтобы он отображался при выводе ТЗ всего один раз.
Код:
ТабЗн=СоздатьОбъект("ТаблицаЗначений");
ТабЗн.НоваяКолонка("ФИО");
ТабЗн.НоваяКолонка("ДатаРождения");
ТабЗн.НоваяКолонка("ПорядковыйНомер");
... //поиск пациента в базе
ТабЗн.Свернуть("1,2", "3");

Если сворачиваю таким образом, то происходит суммирование порядкового номера записи в реестре и, в случае присутствия двух или более записей по одному человеку в реестре, номер отображается уже неправильно (он банально суммируется и вместо 41 например отображается уже 82 и т.п.). Пробовал различные варианты свертки - 1С то ругается на слишком малое количество параметров, то на слишком большое, то выдает:

Код:
НомерПП = ТабЗн.ПорядковыйНомер;
{Документ.РеестрСчетовВходящий.Форма.Модуль(778)}: Поле агрегатного объекта не обнаружено (ПорядковыйНомер)

Может есть какой-то способ обойти эту проблему? :ya_lamo:
 
K

KiR

А со сверткой там подстава - можно или по трем параметрам сворачивать или же один будет суммироваться, а в противном случае (если не указывать) - вообще теряться.

кроме того если есть 2 позиции с разными номерами - какой номер тебе нужно оставить? в любом случае врядли у тебя получится воспользоваться - ТабЗн.Свернуть(); для того чтобы решить поставленную задачу

я бы сделал так - при добавлении новой строки - проверял бы есть ли уже в Таблице такое ФИО и если нет - только тогда добавлял бы
 
B

BBDragon

KiR, спасибо огромное! Номер вроде бы без разницы какой ставить, уточню это позже. Пока попробую сделать как Вы посоветовали :ya_lamo:
 
K

KiR

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

vbs

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

Дайнеко

Позвольте мне подсказать, как надо делать. Лучше всего - красиво. В смысле правильно.
Начну с команды Свернуть:
Код:
ТабЗн.Свернуть("1,2", "3");
Система понимает ее так: объединить одинаковые первую и вторую колонку, в третью просумировать.
1) BBDragon, так нормальные пацаны не делают! Они пишут имена полей: ТабЗн.Свернуть("ФИО,Дата",.....
2) Порядковый номер. А какой результат ты хочешь получить? Если человек есть на 10 и 23 строках. Сам подумай, так 10 или 23 или их сумма или произведение. А если бы тебе на бумаге такой список дали, ты бы руками как сделал?
Поэтому с ним можно только распрощаться. Делаем так:
Код:
ТабНов.Загрузить(ТабЗн);
ТабНов.Свернуть("ФИО,Дата", );
Запятая нужна, в методе два параметра. Пропустив второй мы указываем ничего не суммировать. Получаешь список краткий и полный. Это если потом нужно вывести отчетик, где за строкой ФИО выводится все его номера.
3) А если тебе нуже только первый / последний номер, тогда, как и советует народ, предварительным поиском.
4) Также в стиле заведи хорошую манеру писать типы данных:
Код:
ТабЗн.НоваяКолонка("ФИО", "Строка");
ТабЗн.НоваяКолонка("ДатаРождения", "Дата");
ТабЗн.НоваяКолонка("ПорядковыйНомер", "Число", 5,0);
Это облегчает работу системе и предохраняет от возможных ошибок.
 
B

BBDragon

Дайнеко, полностью согласен с вашей критикой, но, к сожалению, этот метод также не работает, 1С выдает такую же ошибку:
Код:
ДатаРождения=ТабНов.ДатаРождения;
{Документ.РеестрСчетовВходящий.Форма.Модуль(749)}: Поле агрегатного объекта не обнаружено (ДатаРождения)
 
B

BBDragon

так ТабНов или ТабЗн ?

Добавлено:
вроде ТабЗн

ТабНов, ибо ругается 1С именно в куске кода, ответственном за вывод на экран, а там использовалась ТабНов. Все, проблема решена, сделал так как и предлагали ранее KiR и vbs, т.е. просматриваю ТЗ и если там уже человек есть, то просто не вношу его. Всем огромное спасибо за помощь :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!