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

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

Автор Tekkonkinkreet, 07 мая 2011, 18:51

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

Tekkonkinkreet

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

Вот например если просто значение не из справочника у меня получается:

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

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

Буду очень благодарна помощи

zkolenko


Предлагаю решение этой задачи.
Находим в справочнике Номенклатура нужную услугу по коду (у меня услуга доставка
в справочнике находится с кодом 00075, код в виде строки, а у вас будет другой
код для доставки, так что проставите свой код) и
при установки флажка "НеобходимостьДоставки" добавляем эту услугу
в табличную часть документа которая у меня называется "Товары"
Но если вы снимаете флажок "НеобходимостьДоставки" тогда обходим
табличную часть документа и удаляем оттуда услугу доставки даже если
ее туда забивали руками.
В этой строчке
Строка.Цена = НужнаяУслуга.РеквизитЦеныТовара;
Вместо "РеквизитЦеныТовара" впишите название реквизита справочника номенклатуры
где у Вас храниться цена
Все. Теперь пробуйте.

Процедура НеобходимостьДоставкиПриИзменении(Элемент)
   НужнаяУслуга = Справочники.Номенклатура.НайтиПоКоду("00075");
   Если Элемент.Значение Тогда
      ЭлементыФормы.Товары.ДобавитьСтроку();
      Строка = ЭлементыФормы.Товары.ТекущиеДанные;
      Строка.Номенклатура = НужнаяУслуга;
      Строка.Количество = 1;
      Строка.Цена = НужнаяУслуга.РеквизитЦеныТовара;
   иначе
      Для Каждого Стр Из Товары Цикл
         Если Стр.Номенклатура = НужнаяУслуга Тогда
            Товары.удалить(Товары.Индекс(Стр));
         КонецЕсли;
      КонецЦикла;
   КонецЕсли;
КонецПроцедуры

Конечно это не самый лучший способ решения этого вопроса, так как если удалить
из справочника номенклатуры Услуги ДОСТАВКА или поменять ее код, тогда вышеприведенная
программа будет искать код 00075 а такого кода либо нет либо там будет другая услуга.
Есть более правильный способ и с защитой от неприятностей изменения кода услуги.
Если интересно, могу расказать :)
Но для этого нажмите на ссылочку с надписью "Сказать спасибо"

Tekkonkinkreet

Большое Вам спасибо :) все получилось :))
Мне конечно для студенческой работы хватит и этого, но уж интересно и как по-хорошему делать, так что пишите :)

zkolenko

Самый лучший способ это в справочнике Номенклатура создать предопределенный
элемент установить у него код и наименование, например код = "00000000001" а
имя = "УслугаДоставка", наименование это то что видит пользователь, больше здесь ничего заполнить неудасться.
В пользовательском режиме откроете этот проедопределенный элемент и дозаполните его
полностью. Там цену, и т.д. Теперь к этому предопределенному элементу мы
будем обращаться непосредственно из конфигуратора, как будто это перечисление, а в пользовательском режиме
его удалить никак нельзя, и если вы там что и поменяете то код и имя все
равно остануться как назвали в конфигураторе, даже если изменить код или наименование например не "УслугаДоставка" а "Услуга по доставке".
Теперь программа всегда найдет доставку и заполнит а код будет
выглядеть следующим образом.

Процедура НеобходимостьДоставкиПриИзменении(Элемент)
   НужнаяУслуга = Справочники.Номенклатура.УслугаДоставка;
   Если Элемент.Значение Тогда
      ЭлементыФормы.Товары.ДобавитьСтроку();
      Строка = ЭлементыФормы.Товары.ТекущиеДанные;
      Строка.Номенклатура = НужнаяУслуга;
      Строка.Количество = 1;
      Строка.Цена = НужнаяУслуга.РеквизитЦеныТовара;
   иначе
      Для Каждого Стр Из Товары Цикл
         Если Стр.Номенклатура = НужнаяУслуга Тогда
            Товары.удалить(Товары.Индекс(Стр));
         КонецЕсли;
      КонецЦикла;
   КонецЕсли;
КонецПроцедуры

я сам сейчас контрольную по экономике предприятия пишу, устал писать в тетради вот решил на форуме кому нибудь помочь.
Через месяц сессия а я как обычно в самый последний момент..... :)

Tekkonkinkreet

И ещё раз спасибо, буду знать :)
хотела б ещё вопрос задать тут, чтоб тему отдельную не создавать, если вы не против :)
у меня дальше по заданию нужно сделать отчет, который выводит информацию о заказах и в нем вручную напротив каждого заказа проставить фамилию водителя, а после доставки в отчете делать отметку о выполненной доставке. Я вот мало знакома с 1с, но в примерах нигде не видела чтоб в отчете можно было как в документе изменять поля. Вот. Собственно можно так делать или нет?

zkolenko

Я сейчас попробовал это сделать и у меня получилось следующее.
Создал макет, есть ячейка для заполнения заказов из запроса, есть ячейка "Водитель" для заполнения в ручную выбором его из справочника.Водители и ячейка "Доставлено" заполняется вручную из перечисления.ВариантыОтветов со значениями ДА или НЕТ.
В свойствах ячеек ВОДИТЕЛЬ и ДОСТАВЛЕНО нужно поставить галочку напротив "содержит значение" и установить тип значений как выше для них описано.

На форме создается реквизит с типом "табличный документ" и при нажатии на кнопку "сформировать" програмно заполняем макет с получеными заказами из запроса, и выводим его на форму.
Имеем:
Заказ           | Водитель           | Доставлено
ДокЗак№23  |                        |

теперь кликая по полю "водитель" открывается форма выбора водителя из справочника а кликая по полю "доставлено" выбираем ДА или НЕТ из перечисления.ВариантыОтветов

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

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

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

Но то, что еще как минимум несколько способов ее решения есть я ни капельки не сомневаюсь.

Теги:

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

Рейтинг@Mail.ru

Поиск