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

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

Автор Ирина1109, 26 авг 2015, 12:25

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

Kironten

Цитата: Ирина1109 от 27 авг 2015, 11:16
Есть 2 документа: НачислениеАбонентскойПлаты и ОплатаАбонентскойПлаты. В первом документе есть табличная часть,котораявключает реквизит - абонентская плата. В документе ОплатаАбонентскойПлаты я создала 2 реквизита- Клиент и АбонентскаяПлата. Надо чтобы при заполнении реквизита Клиент автоматически проставлялось значение АбонентскаяПлата из первого документа.

Подскажите пожалуйста как это реализовать?

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

Ирина1109

Цитата: Kironten от 27 авг 2015, 12:05
Цитата: Ирина1109 от 27 авг 2015, 11:16
Есть 2 документа: НачислениеАбонентскойПлаты и ОплатаАбонентскойПлаты. В первом документе есть табличная часть,которая включает реквизит - абонентская плата. В документе ОплатаАбонентскойПлаты я создала 2 реквизита- Клиент и АбонентскаяПлата. Надо чтобы при заполнении реквизита Клиент автоматически проставлялось значение АбонентскаяПлата из первого документа.

Подскажите пожалуйста как это реализовать?

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

Пока нужно сделать такое упрощение и считать, что в документе1 будет, например,только одна строка с Клиентом - Иванов и соответственно одно значение АбонентскойПлаты для него   

Kironten

Цитата: Ирина1109 от 27 авг 2015, 12:30
Пока нужно сделать такое упрощение и считать, что в документе1 будет, например,только одна строка с Клиентом - Иванов и соответственно одно значение АбонентскойПлаты для него
Тогда вообще не понятно зачем нужна ТЧ. Ну да ладно, на Вашей совести.
В общем алгоритм такой
1.Находите по ссылке клиента нужный документ
2.Из этого документа берете строку ТЧ (в вашем случае первую) и из нее берете значение.
Код примерно таков:
&НаСервере
    Функция ОпределениеСтоимости(Элемент)
        Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Док.Ссылка
|ПОМЕСТИТЬ ВТДок
|ИЗ
| Документ.НачислениеАбонентскойПлаты КАК Док
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ДокТЧ.Сумма
|ИЗ
| Документ.НачислениеАбонентскойПлаты.<ИмяТЧ> КАК ДокТЧ
|ГДЕ
| ДокТЧ.Ссылка В
| (ВЫБРАТЬ
| ВТДок.Ссылка
| ИЗ
| ВТДок КАК ВТДок)";

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

        Если РезультатЗапроса.Следующий() Тогда
            Возврат РезультатЗапроса.Сумма;
        Иначе
            Возврат 0;
        КонецЕсли;
   КонецФункции

Добавлено: 27 авг 2015, 13:09


Параметры забыл:
[code]&НаСервере
    Функция ОпределениеСтоимости(Элемент)
        Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Док.Ссылка
|ПОМЕСТИТЬ ВТДок
|ИЗ
| Документ.НачислениеАбонентскойПлаты КАК Док
                |ГДЕ
| Док.Клиент = &Клиент
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ДокТЧ.Сумма
|ИЗ
| Документ.НачислениеАбонентскойПлаты.<ИмяТЧ> КАК ДокТЧ
|ГДЕ
| ДокТЧ.Ссылка В
| (ВЫБРАТЬ
| ВТДок.Ссылка
| ИЗ
| ВТДок КАК ВТДок)";
Запрос.УстановитьПараметр("Клиент", Элемент);
РезультатЗапроса = Запрос.Выполнить().Выбрать();

        Если РезультатЗапроса.Следующий() Тогда
            Возврат РезультатЗапроса.Сумма;
        Иначе
            Возврат 0;
        КонецЕсли;
   КонецФункции
[/code]

cska-fanat-kz

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

а. документ Плата в этом случае заполняется по остаткам регистра
б. заодно всегда видно задолженность по человеку
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Ирина1109

Цитата: Kironten от 27 авг 2015, 12:43
Цитата: Ирина1109 от 27 авг 2015, 12:30
Пока нужно сделать такое упрощение и считать, что в документе1 будет, например,только одна строка с Клиентом - Иванов и соответственно одно значение АбонентскойПлаты для него
Тогда вообще не понятно зачем нужна ТЧ. Ну да ладно, на Вашей совести.
В общем алгоритм такой
1.Находите по ссылке клиента нужный документ
2.Из этого документа берете строку ТЧ (в вашем случае первую) и из нее берете значение.
Код примерно таков:
&НаСервере
    Функция ОпределениеСтоимости(Элемент)
        Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Док.Ссылка
|ПОМЕСТИТЬ ВТДок
|ИЗ
| Документ.НачислениеАбонентскойПлаты КАК Док
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ДокТЧ.Сумма
|ИЗ
| Документ.НачислениеАбонентскойПлаты.<ИмяТЧ> КАК ДокТЧ
|ГДЕ
| ДокТЧ.Ссылка В
| (ВЫБРАТЬ
| ВТДок.Ссылка
| ИЗ
| ВТДок КАК ВТДок)";

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

        Если РезультатЗапроса.Следующий() Тогда
            Возврат РезультатЗапроса.Сумма;
        Иначе
            Возврат 0;
        КонецЕсли;
   КонецФункции

Добавлено: 27 авг 2015, 13:09


Параметры забыл:
[code]&НаСервере
    Функция ОпределениеСтоимости(Элемент)
        Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Док.Ссылка
|ПОМЕСТИТЬ ВТДок
|ИЗ
| Документ.НачислениеАбонентскойПлаты КАК Док
                |ГДЕ
| Док.Клиент = &Клиент
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ ПЕРВЫЕ 1
| ДокТЧ.Сумма
|ИЗ
| Документ.НачислениеАбонентскойПлаты.<ИмяТЧ> КАК ДокТЧ
|ГДЕ
| ДокТЧ.Ссылка В
| (ВЫБРАТЬ
| ВТДок.Ссылка
| ИЗ
| ВТДок КАК ВТДок)";
Запрос.УстановитьПараметр("Клиент", Элемент);
РезультатЗапроса = Запрос.Выполнить().Выбрать();

        Если РезультатЗапроса.Следующий() Тогда
            Возврат РезультатЗапроса.Сумма;
        Иначе
            Возврат 0;
        КонецЕсли;
   КонецФункции
[/code]


Это надо сделать в событии "ПриИзменении" на реквизит Клиент?

Kironten

Цитата: Ирина1109 от 27 авг 2015, 13:41
Это надо сделать в событии "ПриИзменении" на реквизит Клиент?

Это примерный код для Вашей функции, в которой вы значение получаете (из первого поста)
А вообще прислушайтесь к cska-fanat-kz.
Если Вы и дальше планируете заниматься 1с, то правильное конструирование объектов, Вам ой как поможет.

Ирина1109

Цитата: Kironten от 27 авг 2015, 13:49
Цитата: Ирина1109 от 27 авг 2015, 13:41
Это надо сделать в событии "ПриИзменении" на реквизит Клиент?

Это примерный код для Вашей функции, в которой вы значение получаете (из первого поста)
А вообще прислушайтесь к cska-fanat-kz.
Если Вы и дальше планируете заниматься 1с, то правильное конструирование объектов, Вам ой как поможет.


Хорошо.Спасибо
Попробовала сделать через регистр накопления, но не работает..хотя ошибок никаких не выдает

&НаКлиенте
Процедура ОплатаАбонентскойПлатыКлиентПриИзменении(Элемент)
Объект.АбонентскаяПлата = ПолучитьАбонентскуюПлатуНаСервере(Объект.Дата, Объект.Клиент);
КонецПроцедуры

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





Kironten

Возможно все отрабатывает.
Просто не надо забывать, что в Вашем случае Объект - это ДанныеФормыСтруктура.
Вы по его элементам можете что-то там получить, но вот для того, чтобы результат этого чего-либо отразился в "ДанныхФормы" то надо этот результат, поместить в сам Объект.
Проверьте в отладке, если вы получаете в выборке результат, то скорее всего дело в этом.
Иначе говоря, код будет примерно такой:
&НаКлиенте
Процедура ОплатаАбонентскойПлатыКлиентПриИзменении(Элемент)
ПолучитьАбонентскуюПлатуНаСервере();
КонецПроцедуры

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


По моему так.

Ирина1109

Цитата: Kironten от 27 авг 2015, 14:42
Возможно все отрабатывает.
Просто не надо забывать, что в Вашем случае Объект - это ДанныеФормыСтруктура.
Вы по его элементам можете что-то там получить, но вот для того, чтобы результат этого чего-либо отразился в "ДанныхФормы" то надо этот результат, поместить в сам Объект.
Проверьте в отладке, если вы получаете в выборке результат, то скорее всего дело в этом.
Иначе говоря, код будет примерно такой:
&НаКлиенте
Процедура ОплатаАбонентскойПлатыКлиентПриИзменении(Элемент)
ПолучитьАбонентскуюПлатуНаСервере();
КонецПроцедуры

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


По моему так.


Спасибо за советы. Но что-то у меня так и не получилось. Проверила в отладке, у меня не отрабатывает, получается результат 0..не пойму почему

Kironten

Цитата: Ирина1109 от 27 авг 2015, 15:48
Спасибо за советы. Но что-то у меня так и не получилось. Проверила в отладке, у меня не отрабатывает, получается результат 0..не пойму почему

Для начала проверьте, есть ли вообще интересующие Вас записи в регистре накопления.
Если есть, то запихните запрос в консоль запросов, и проверяйте поэтапно. Сперва получите все записи и пошагово накладывайте отборы. Ищите где ошиблись.

Теги:

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

Рейтинг@Mail.ru

Поиск