Консультация № 110244
20.11.2007, 10:00
0.00 руб.
0 4 4
Уважаемые эксперты! Есть необходимость создать самодельный документ, имеющий две табличной части(справочники), причем каждая строка первой Табличной части которого имеет несколько строк во второй части (отношение один ко многим). Причем реализовать добавление записей во второй табличной части.
Помогите советом как и на основе чего лучше будет сделать. Если можно то и какой-нить пример-шаблон. Спасибо.

Обсуждение

Неизвестный
20.11.2007, 13:12
общий
это ответ
Здравствуйте, VOFFka_!
Для 1С7.7 я сделал так: объединил все записи в одной табличной части. Скриншот в приложении.
Легко обрабатывается, и проводится.
Ограничение: должно быть не более 9999 строк.
Неизвестный
20.11.2007, 15:51
общий
это ответ
Здравствуйте, VOFFka_!
Для 1С 8.0 можно сделать любое количество табличных частей.
В Вашем случае возможно будет достаточно просто разместить на форме 2 табличных поля с типом СправочникСписок. Если второй справочник является подчиненным, то достаточно установить связь по владельцу. Табличные Части в документе в этом случае либо вообще не нужны, либо могут не отображаться на форме, а заполняться при записи документа и восстанавливаться при открытии.
Неизвестный
21.11.2007, 02:45
общий
это ответ
Здравствуйте, VOFFka_!

Для версии 8.0, как правильно заметила Яна, две табличные части не составляют проблемы. Поэтому пишу прореализацию в версии 7.7, где не все так тривиально.
На форме добавляете 2 реквизита диалога "Таблица значений", проставляете им идентификаторы ТЗ1 и ТЗ2 (к примеру). Далее в процедуре ПриОткрытии() заполняете ТЗ1 и указываете какие колонки будут у ТЗ2. На форме помещаете реквизит диалога "Текст", ставите ему признак невидимости, в свойствах в качестве формулы прописываете функцию СформироватьТЗ2() -- в результате она будет выполняться каждый раз когда на форме произойдут какие-то изменения, например курсор переместится с одной строки ТЗ1 на другую. В модуле прописываете эту функцию, возвращать она всегда будет пустую строку "", гораздо важнее то что она будет заполнять данными ТЗ2 в зависимости от того, на какой строке указатель в ТЗ1 (метод ТекущаяСтрока()). Предусмотрите, чтобы ТЗ2 перезаполнялась только если строка ТЗ1 действительно была изменена, для этого запоминайте на какой строке ТЗ1 курсор был в прошлый раз.
Для добавления строк в ТЗ2 добавьте на форме кнопку. Тогда и об удалении, кстати, стоило бы подумать, и об редактировании.
И ни в коем случае в модуле не должно быть строчек типа <i>Перем ТЗ1, ТЗ2;</i> или <i>ТЗ1=СоздатьОбъект("ТаблицаЗначений"); ТЗ2=СоздатьОбъект("ТаблицаЗначений");</i>, иначе потом будете голову ломать почему на экране ничего не меняется :)

Как видите, программный код будет не очень маленький, поэтому писать сам я его не стал (хотя года три назад реализовывал такую задачу, но исходники не сохранились). Однако задача вполне решаема, думаю Вам понравится результат :)
Неизвестный
21.11.2007, 21:24
общий
это ответ
Здравствуйте, VOFFka_!

Немного дополню ответ, который дал Сергей Максименко [Elric]. Предложенный им метод очень хорош и наверное единственно правильный. Но не забудьте пожалуйста, что документ после закрытия все же должен хранить какую-то информацию, а ТаблицаЗначений на форме на это не способна. Как вариант, можно в реквизитах табличной части полностью дублировать содержимое ТЗ1 и ТЗ2. Тогда при сохранении все останется на своих местах, а при открытии, как и предполагалось, нужно заполнить ТЗ1 и ТЗ2 из табличной части.
Если все же у вас еще осталась необходимость в примере, то у меня есть конфигурация с таким документом, напишите, я выложу куда-нибудь.
Форма ответа