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

Тема в разделе "1C и всё что с ней связано", создана пользователем BBDragon, 13 ноя 2010.

  1. BBDragon

    BBDragon Well-Known Member

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

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

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    А со сверткой там подстава - можно или по трем параметрам сворачивать или же один будет суммироваться, а в противном случае (если не указывать) - вообще теряться.

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

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

    BBDragon Well-Known Member

    Регистрация:
    4 май 2008
    Сообщения:
    148
    Симпатии:
    0
    KiR, спасибо огромное! Номер вроде бы без разницы какой ставить, уточню это позже. Пока попробую сделать как Вы посоветовали :ya_lamo:
     
  4. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    да не за что. может еще кто-то что-то более правильное или удобное подскажет.
    просто сам сталкивался со сверткой и долго мучился и в итоге, ручками делал перебор.
     
  5. vbs

    vbs Well-Known Member

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

    Дайнеко Well-Known Member
    1C Team

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

    BBDragon Well-Known Member

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

    TimeDontWait Well-Known Member

    Регистрация:
    4 янв 2010
    Сообщения:
    383
    Симпатии:
    0
    так ТабНов или ТабЗн ?

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

    BBDragon Well-Known Member

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

Поделиться этой страницей