Заполнить табличную часть на основании реквизита табличной части

&НаКлиенте

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт

//Если ИдентификаторКоманды = "Заполнить" Тогда

//

// Документ = ОбъектыНазначения[0];

// КонецЕсли;

//Спросим у пользователя разрешение на продолжение обработки

Режим = РежимДиалогаВопрос.ДаНет;

Текст = "Текущие данные документа будут заменены новыми без возможности восстановления.

|Продолжить?";

Ответ = Вопрос(Текст, Режим, 0);

Если Ответ = КодВозвратаДиалога.Да Тогда

ЦенаДляУстановки = 1;

Если ВвестиЧисло(ЦенаДляУстановки, "Введите цену для установки", 10, 2) Тогда

//Если пользователь дал разрешение на продолжение, то начнем перебирать все

//документы, у которых мы планируем заполнить табличную часть

Для каждого Элемент из ОбъектыНазначения Цикл

//Зададим ключ поиска документа, из которого вызвана данная обработка,

//чтобы получить ссылку на редактирумый документ в удобном виде для

//функции ОткрытьФорму()

КлючПоиска = Новый Структура("Ключ", Элемент);

//Но нам не надо открывать новую форму (окно) для изменяемого документа, а

//Нам надо все изменения показать в уже открытых у клиента окнах

Окна = ПолучитьОкна();

Для каждого Окно из Окна Цикл

//Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому

//сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна

//изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться

//Наименование, номер и дата нужного документа - будем изменять

Если НЕ Окно.Основное

И Найти(Окно.Заголовок, Элемент) Тогда

//Передадим ключ поиска (можно сказать ссылку на объект) и данные о найденном открытом окне

//в функцию ОткрытьФорму()

//Код находится в цикле на тот случай, если открытых окон изменяемого документа больше одного

Форма = ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокумента",КлючПоиска,,,Окно);

//Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную

//В объекте содержатся все реквизиты (элементы) формы

НовыйОбъект = Форма.Объект;

//Мы помещаем объект формы в переменную,

//так как должны передать её в процедуру на сервере,

//где нельзя изменять объект формы, зато можно править переменную содержащую его

ЗаполнитьОбъект(НовыйОбъект,ЦенаДляУстановки);

ТоварыЦенаПриИзменении(НовыйОбъект);

//После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,

//которую необходимо передать в уже полученную нами форму

КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);

КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

Заполнение табличной части при выборе реквизита другой табличной части в документе.

Автор Vlad-93, 25 окт 2017, 10:53

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

Здравствуйте. Являюсь новичком в 1с, поэтому скорее всего глупый вопрос, но все же. Конфигурация самописная. Управляемое приложение.

Есть Справочник — Детали. У Справочника детали есть табличная часть Операции со своими реквизитами.
Есть Документ — Формирование узла. Реквизит — НаименованиеУзла. И 2 табличные части — Детали и Операции.
В табличной части Детали есть реквизит Наименование с Типом СправочникСсылка.Детали
Проблема в следующем: Необходимо, чтобы при выборе Детали из табличной части Детали, заполнялась табличная часть Операции. И по мере заполнения Табличной части Детали — деталями, заполнялась табличная часть — Операции.
Предполагаю, что надо делать в обработчике событий ПриИзменении реквизита табличной части Детали — Наименование. Но как именно делать в плане запросом или каким то другим методом пока не понял.
Буду благодарен любому совету. Спасибо.


Цитироватьпо мере заполнения Табличной части Детали — деталями, заполнялась табличная часть — Операции.

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


Цитата: AIFrame от 25 окт 2017, 11:11

Цитироватьпо мере заполнения Табличной части Детали — деталями, заполнялась табличная часть — Операции.

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

По поводу интерактивности приму к сведению, спасибо. Но у меня проблема заключается в более банальной вещи, как мне кажется.
Меня интересует, как мне вытянуть из реквизита табличной части — Детали, Наименование(СправочникСсылка.Детали), табличную часть — Операции из справочника Детали. Я так понимаю, это лучше сделать через запрос по кнопке после заполнения табличной части Детали. Просто, после того, как я это сделаю. Мне нужно будет высчитывать в табличной части — Операции, некоторые поля исходя из имеющихся.(Но это уже не проблема).


Для Каждого Деталь ИЗ Детали Цикл
    Для Каждого Операция из Деталь.Операции Цикл
        // Пердолим детали
    КонецЦикла;
КонецЦикла;


Если я правильно понял, то самый правильный вариант — запросом.
Если правильно составлен запрос, то можно сделать так:

ИмяТЧ.Загрузить(Запрос.Выполнить().Выгрузить());
если нужно заполнить всю т.ч. (все записи)
если не всю, тогда;

//очистить ТЧ от лишних записей:

Выброрка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ЗаполнитьЗначенияСвойств(ИмяТЧ.Добавить());
КонецЦикла;

ЗЫ.
В запрос можно впихнуть и те строки, которые удалять не нужно при заполнении ТЧ, тогда первый вариант то же можно использовать.

Спасибо за Сказать спасибо


Всем спасибо. По итогу решил сделать через запрос.
Итоговый код вышел такой.


&НаСервере
Процедура Подбор()

Объект.СписокОпераций.Очистить();

Для Каждого Деталь Из Объект.Детали Цикл

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | ДеталиСписокОпераций.Ссылка,
               | ДеталиСписокОпераций.НомерСтроки,
               | ДеталиСписокОпераций.Наименование,
               | ДеталиСписокОпераций.Код,
               | ДеталиСписокОпераций.НомерПоТехПроцессу,
               | ДеталиСписокОпераций.КодБригады,
               | ДеталиСписокОпераций.КодСтавки,
               | ДеталиСписокОпераций.РазрядРабот,
               | ДеталиСписокОпераций.НормаВремМин,
               | ДеталиСписокОпераций.ПовышенияСделРасц,
               | ДеталиСписокОпераций.КодЦеха
               |ИЗ
               | Справочник.Детали.СписокОпераций КАК ДеталиСписокОпераций
               |ГДЕ
               | ДеталиСписокОпераций.Ссылка = &Деталь";
   
Запрос.УстановитьПараметр("Деталь", Деталь.Наименование.Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = Объект.СписокОпераций.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
        КонецЦикла;

КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда)

Подбор();

КонецПроцедуры


В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 1С 8.3. В этой статье мы изучим некоторые вопросы программной работы с табличными частями 1С.

Заполнение табличной части 1С 8.3

Очень часто встречается задача заполнить табличную часть какими-нибудь  значениями, например результатом выполнения запроса.  Для демонстрации реализуем пример, в котором выполняется заполнение табличной части. Сделаем небольшую учебную задачу: будем заполнять табличную часть документа всей номенклатурой, которая не помечена на удаление. Количество при этом будет равно 1. Для заполнения табличной части документа нам необходимо работать с  одноименной таблицей реквизита Объект, который является основным реквизитом управляемой формы.

Табличная часть реквизита Объект

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

Команда 1С и размещение её на форме

Исполнение команды будет выполняться в серверном контексте, поскольку объект Запрос не работает в клиентском контексте на тонком клиенте.

&НаСервере
Процедура ЗаполнитьТоварамиНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    Товары.Ссылка КАК Товар,
                   |    1 КАК Количество
                   |ИЗ
                   |    Справочник.Товары КАК Товары
                   |ГДЕ
                   |    НЕ Товары.ПометкаУдаления";
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        НовСтр = Объект.СписокТоваров.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
    КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТоварами(Команда)
    ЗаполнитьТоварамиНаСервере();
КонецПроцедуры

При обходе запроса, я использую метод Добавить табличной части объекта (вообще это метод объекта, который имеет тип ДанныйФормыКоллекция, именно в этот тип преобразуется табличная часть документа-объекта, при создании на сервере). Данный метод является функцией, которая создаёт и возвращает новую строку.

Обратите внимание, поскольку при обходе запроса и заполнения новой строки, я использую метод ЗаполнитьЗначенияСвойств, то поля в запросе должны называться так же, как и поля табличной части.

Очистка табличной части документа 1С 8.3

Если  мы реализуем данный код, то он будет не совсем корректен: каждый раз при выполнении этого кода будут добавляться новые строки, а вполне возможно, что пользователю старые строки не нужны. Поэтому, будем очищать имеющиеся строки,  перед добавлением новых строк. Для этого воспользуемся методом Очистить объекта СписокТоваров, который имеет тип  ДанныйФормыКоллекция.

Объект.СписокТоваров.Очистить();

После выполнения этого метода вся табличная часть будет очищена.

Текущая строка табличной части 1С 8.3

В процессе работы может возникнуть необходимость отработать текущую строку табличной части, т.е. ту строку, которая в данный момент выделена.

Текущая строка табличной части 1С 8.3

Например, может возникать ситуация, что мы редактируем какое-нибудь поле текущей строки таблицы на форме, и нам нужно, чтобы было пересчитано другое поле  (или несколько полей) этой текущей строки. Например, мы изменяем цену (или количество) нашей табличной части, и необходимо, чтобы сумма автоматически была пересчитана.

Для решения данной задачи нужно воспользоваться свойством ТекущиеДанные элемента с типом ТаблицаФормы, который соответствует нужной табличной части. Свойство ТекущиеДанные возвращает значение полей текущей строки.

Возврат полей свойством ТекущиеДанные

Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.

Обработчик ПриИзменении поля таблицы формы

В этом обработчике напишем код, который будет пересчитывать значения полей текущей строки табличной части.

&НаКлиенте
Процедура СписокТоваровЦенаПриИзменении(Элемент)
	ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат; //если пустая таблица
	КонецЕсли;
	ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

Ещё пример: я создал команду, которая должна увеличивать количество в текущий строке табличной части в два раза и пересчитывать сумму. Эта команда размещена в командной панели таблицы и имеет следующий код:

&НаКлиенте
Процедура УмножитьНа2(Команда)
    ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
    Если ТекДанные = Неопределено Тогда
        Возврат; //если пустая таблица
    КонецЕсли;
    ТекДанные.Количество = ТекДанные.Количество * 2;
    ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
КонецПроцедуры

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

Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
ИдентификторСлед = Идентификтор + 1;

Если ИдентификторСлед < Объект.СписокТоваров.Количество() Тогда
    Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед;
КонецЕсли;

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

Также при помощи текущей строки можно находить аналогичную строку в соответствующей табличной части основного реквизита формы Объект, которую также можно изменять (строка на форме тоже изменится автоматически). Мы ранее сделали пересчет суммы при изменении цены, теперь сделаем пересчет суммы при изменении количества, но напрямую через реквизит Объект.

&НаКлиенте
Процедура СписокТоваровКоличествоПриИзменении(Элемент)
    Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
    Если Идентификтор = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор);
    Если ТекСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
КонецПроцедуры

В этом коде мы используем метод НайтиПоИдентификатору переменной Объект.СписокТоваров, которая имеет типа ДанныйФормыКоллекция, этот метод получает элемент коллекции по указанному идентификатору. Если этот элемент найден, то мы можем с ними работать, причем данные на форме изменяться автоматически.

Обход табличной части 1С

Часто возникают задачи обойти табличную часть и изменить какие-либо значения в столбцах. В предыдущих примерах мы изменяли текущую стоку таблицы, теперь реализуем пример, когда нужно изменить все строки. В этом случае нет необходимости обращаться к элементам формы, можно работать напрямую с основным реквизитом Объект.

&НаКлиенте
Процедура УмножитьВсеНа2(Команда)

    ТабОбх = Объект.СписокТоваров;
    Для Каждого стрТабл из ТабОбх Цикл
        стрТабл.Количество = стрТабл.Количество * 2;
        стрТабл.Сумма = стрТабл.Цена * стрТабл.Количество;
    КонецЦикла;

КонецПроцедуры

Остальные статьи по теме конфигурирования в 1С:

Конфигурирование табличный частей объектов 1С

Справочники в 1С 8.3

Документы в 1С 8.3

Предопределенные элементы справочников 1С

Формы справочников в 1С 8.3

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Есть справочник Группы, и у него есть реквизит стандартный реквизит «Наименование» . Также есть справочник Подгруппы, я написал функцию для передачи из  табличной часть в другую табличную часть, но возникла проблема. Он перекидывает мне вообще всех студентов, а мне нужно именно в отдельной группе. В справочнике Подгруппы есть реквизит ОсновнаяГруппа. Нужно чтобы брать тольео студентов их определенной группы ( по названия ), но я даже не представляю, как это сделать ( совсем зеленый) . Спасибо, если поможете.

&НаКлиенте

Процедура ЗаполнитьИзОсновнойГруппы(Команда)

    
ПоискСтудентов();

    
КонецПроцедуры

&НаСервере

Процедура ПоискСтудентов ()

    Запрос = Новый Запрос();

    Запрос.Текст =»ВЫБРАТЬ

     |    ФИО КАК ФИО

     |ИЗ

     |    Справочник.Группы.Студенты

     |  (ГДЕ Ссылка.Наименование = &Наименование) — не работает

     |

     |УПОРЯДОЧИТЬ ПО

     |    ФИО» ;

    
     Результат = Запрос.Выполнить().Выгрузить();

     Объект.Студенты.Загрузить(Результат);

              
    
    КонецПроцедуры

Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

1

1C 8.x

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

15.08.2012, 14:55. Показов 23322. Ответов 13

Метки нет (Все метки)


Здравсвуйте. 1С 8.2.
Есть документ Приход и документ Расход. Оба документа имеют табличные части — Товары.
В табличной части документа Расход есть реквизит ВыбратьДокумент, в котором выбирается документ Приход.
Нужно, чтобы при выборе документа Приход, реквизиты табличной части Расход заполнялись из табличной части документа Приход.
Не получается это сделать. Как правильно оформляется поиск по табличной части документа?
Я пишу что-то такое…

1C
1
2
3
4
5
6
7
Процедура ТоварыВыбратьДокументПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Для каждого ТкущаяСтрока из Документы.Приход.ПолучитьРеквизитыДокумента( ...
           ???) 
... 
КонецПроцедуры



0



duk337

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

15.08.2012, 15:42

2

1C
1
2
Запрос.Текст="ВЫБРАТЬ * ИЗ Приход.Товары ГДЕ Ссылка=&ВыбДок";
Товары.Загрузить(Запрос.Выполнить().Выгрузить());



2



Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

15.08.2012, 16:43

 [ТС]

3

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

1C
1
2
3
4
5
6
7
8
9
10
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|Услуги.Имя КАК Имя,
|Услуги.Код КАК Код
|ИЗ
|Документы.Приход.Услуги
|ГДЕ
|Документы.Приход = &Документ";
 
Услуги.Загрузить(Запрос.Выполнить().Выгрузить());

Так? (вместо Товары — Услуги … >_<)



0



Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

15.08.2012, 17:10

 [ТС]

4

Вот запрос конструктором запроса, но он совсем непонятный.
что после запроса написать надо?

1C
1
2
3
4
5
6
7
8
9
Запрос.Текст = "ВЫБРАТЬ
                   |    ПриходУслуги.Имя,
                   |    ПриходУслуги.Код,
                   |    РасходУслуги.Документ
                   |ИЗ
                   |    Документ.Приход.Услуги КАК ПриходУслуги,
                   |    Документ.Расход.Услуги КАК РасходУслуги
                   |ГДЕ
                   |    РасходУслуги.Документ = &ПриходУслуги.Ссылка";



0



duk337

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

15.08.2012, 22:44

5

Создайте отчет. Макеты.КонструкторФормы. Он сам Вам напишет и заодно выведет в табдок.

Цитата
Сообщение от Titanum
Посмотреть сообщение

ИЗ | Документ.Приход.Услуги КАК ПриходУслуги,
| Документ.Расход.Услуги КАК РасходУслуги

Вообще, это не конструктор поработал. Два документа нельзя тупо писать рядом, как в семёрке. Тут чистый скуль и надобно соединение

Добавлено через 5 минут
А чем это не устраивает?

1C
1
2
3
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Имя,Код ИЗ Документы.Приход.Услуги ГДЕ Ссылка = &Документ";
Услуги.Загрузить(Запрос.Выполнить().Выгрузить());



1



Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

16.08.2012, 09:19

 [ТС]

6

Выдает ошибку:
Ошибка отображения типов: Отсутствует отображение для типов «ПолеФормы».

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

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&НаКлиенте
Процедура УслугиДокументПриИзменении(Элемент)
    
УслугиДок(Элемент);
        
КонецПроцедуры
 
 
&НаСервере
Процедура УслугиДок(Элемент) Экспорт
 
    Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Имя,Код ИЗ Документы.Приход.Услуги ГДЕ Ссылка = &Документ";
Объект.Услуги.Загрузить(Запрос.Выполнить().Выгрузить());
 
КонецПроцедуры



0



duk337

2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

16.08.2012, 10:59

7

1C
1
2
&НаСервере
Процедура УслугиДок()

или

1C
1
2
&НаСервереБезКонтекста
Процедура УслугиДок(Объект)



1



Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

16.08.2012, 11:07

 [ТС]

8

Спасибо большое!
А как можно обратиться к объекту табличной части?
Например просто к объекту Объект.Услуги. А к реквизиту табличной части? Объект.Услуги.Документ?
Выдает ошибку:
{Документ.Расход.Форма.ФормаДокумента.Форма(16)}: Поле объекта не обнаружено (Документ)
Запрос.УстановитьПараметр(«Документ»,Объект.Докуме нт);

1C
1
2
3
4
5
6
7
&НаСервере
Процедура УслугиДок() Экспорт
    Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Имя,Код ИЗ Документ.Приход.Услуги ГДЕ Ссылка = &Документ";
Запрос.УстановитьПараметр("Документ",Объект.Документ);
Объект.Услуги.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры

Потому что до этого выдавало ошибку:
Не задано значение параметра «Документ»
ВЫБРАТЬ Имя,Код ИЗ Документ.Приход.Услуги ГДЕ Ссылка = <<?>>&Документ



0



2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

16.08.2012, 11:12

9

А реквизит «Документ» присутствует в объекте? Ощущение такое, что он в ТЧ Услуги.
(«Объект» писать не обязательно, он присутствует в контексте.)



1



Titanum

1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

16.08.2012, 11:16

 [ТС]

10

Документ — это реквизит табличной части Услуги. Если пишу просто

1C
1
Запрос.УстановитьПараметр("Документ", Документ);

Так же выдает ошибку: Поле объекта не обнаружено (Документ)



0



2954 / 1766 / 82

Регистрация: 03.11.2011

Сообщений: 8,280

16.08.2012, 11:28

11

Медленно:
Объект — это контейнер типа «ДокументОбъектПриход». Он содержит объект типа «ТабличнаяЧасть» (Услуги). Это тоже контейнер, который содержит объекты типа «СтрокаТЧ».
Перенесите реквизит «Документ» в документ, поскольку он обслуживает всю ТЧ, а не её строку.



1



1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

16.08.2012, 11:33

 [ТС]

12

Всё, теперь понятно. Спасибо огромное. Получается, вобще неправильно задачу поставила…



0



148 / 148 / 3

Регистрация: 05.05.2010

Сообщений: 569

16.08.2012, 15:29

13

А что за конфигурация? Самописная?



1



1 / 1 / 1

Регистрация: 25.10.2011

Сообщений: 360

16.08.2012, 15:34

 [ТС]

14

Нет. Здесь данные приведены просто для примера, чтоб понять алгоритм. Конфигурация УТ 11.



0



Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл

Сообщить(Строка.РеквизитТабличнойЧасти);

КонецЦикла;

На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

Как получить и обойти выделенные строки табличной части

Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.

Работа с табличной частью объектов в 1СДля получения перечня выделенных строк используется следующий код:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для каждого Строка из ВыделенныеСтроки Цикл

//содержимое цикла

КонецЦикла;

Как программно выделить строки табличной части (табличного поля) и снять выделение

Чтобы программно снять выделение строк табличного поля:

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

Чтобы программно выделить все строки табличного поля:

Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

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

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1=«Значение»;

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока.Реквизит1=«Значение»;

Как программно заполнить реквизиты строки табличной части

Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры

Элексир, работать будет, но для 8.Х это идеологически неправильный метод, т.к. перебор будет на стороне клиента (если специально не сделать общий модуль с серверной обработкой), а 8.Х клиент-серверная и правильно ресурсоемкие задачи выполнять на сервере.

Gunslinger, ИМХО нагляднее всего (не в ущерб правильности решения) сделать запросом. Получится что-то вроде:

ТекстЗапроса=
«ВЫБРАТЬ
| НазваниеСправочника.Ссылка,
| НазваниеСправочника.Реквизит1,
| НазваниеСправочника.Реквизит2,
| НазваниеСправочника.Реквизит3
|ИЗ
| Справочник.НазваниеСправочника КАК НазваниеСправочника
|ГДЕ
| (НазваниеСправочника.Реквизит4 = &Параметр4)
| И (НазваниеСправочника.Реквизит5 = &Параметр5)
|
|СГРУППИРОВАТЬ ПО
| НазваниеСправочника.Ссылка,
| НазваниеСправочника.Реквизит1,
| НазваниеСправочника.Реквизит2,
| НазваниеСправочника.Реквизит3
|»;
Запрос=Новый Запрос(ТекстЗапроса);
Запрос.Параметры.Вставить(«Параметр4», РеквизитДокумента4);
Запрос.Параметры.Вставить(«Параметр5», РеквизитДокумента5);
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Заполняем табличную часть
Стр=ТабличнаяЧастьДокумента.Добавить();
Стр.Реквизит1=Выборка.Реквизит1;
// …
КонецЦикла;

Не забудь заменить заглушки на реальные названия справочника и реквизитов

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии