Версия для печати темы (https://pro1c.org.ua/index.php?s=23be8a4fb505dc8995fd106f5659722d&showtopic=19718)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Замена интерфейса выбора ПланаСчетов

Автор: SV71 09.09.14, 10:46

Всем привет!

Самописная конфигурация 1С Предприятие 8.2 в режиме "Управляемое приложение".

Для возможности использования "Субконто" при создании отчетов ведение счетов осуществляется с помощью объекта "ПланыСчетов.НИС_Учт_Сч_Счета".
Атрибут "ПланыСчетов.НИС_Учт_Сч_Счета" включен в табличную часть "Документы.Фин_Док_Платеж".

В то же время возникла задача отображения счетов в произвольном дереве. Для этого создан объект "Справочники.НИС_Учт_Сч_Счета". Один из атрибутов справочника "ПланыСчетов.НИС_Учт_Сч_Счета".

Теперь при редактировании "Документы.Фин_Док_Платеж" в табличной части атрибута "ПланыСчетов.НИС_Учт_Сч_Счета" нужно, чтобы выбор производился из более удобной формы отображения "Справочники.НИС_Учт_Сч_Счета".

Для этого сделал обработчик события "НачалоВыбора"

//////////////////////////////////////////////////////////////////////////////
//
// Процедура ОперацииСчетДТНачалоВыбора
//
// Назначение: Вызывает интерфейс выбора "СчетДТ"
//
// Вызов: Вызывается при нажатии кнопки выбора или нажатии клавиши F4 на атрибуте "СчетДТ"
//
&НаКлиенте
Процедура ОперацииСчетДТНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // ===============================================
    // = Создадим форму выбора из "Справочники.Счета =
    // ===============================================
    фВыборСчета = ОСНВ_ФормаВыбора();
    фВыборСчета.ВладелецФормы = ЭтаФорма;
    фВыборСчета.Открыть();
    
    // ===============================
    // = Передать выбранное значение =
    // ===============================
    //ОповеститьОВыборе(лСчетДТ);
    
    // ===================================
    // = Запретить стандартную обработку =
    // ===================================
    СтандартнаяОбработка = Ложь;
КонецПроцедуры // ОперацииСчетДТНачалоВыбора


//////////////////////////////////////////////////////////////////////////////
//
// Функция ОСНВ_ФормаВыбора
//
// Назначение: Возвращает форму выбора "Справочники.НИС_Учт_Сч_Счета"
//
// Вызов: Процедура ОперацииСчетДТНачалоВыбора
//
&НаСервереБезКонтекста
Функция ОСНВ_ФормаВыбора()
    Возврат Справочники.НИС_Учт_Сч_Счета.ПолучитьФормуВыбора("ФормаВыбора");
КонецФункции // ОСНВ_ФормаВыбора


При попытке исполнения возникает ошибка:
Цитата
{Документ.Фин_Док_Платеж.Форма.ФормаДокумента.Форма(770)}: Ошибка при вызове метода контекста (ПолучитьФормуВыбора)
Возврат Справочники.НИС_Учт_Сч_Счета.ПолучитьФормуВыбора("ФормаВыбора");
по причине:
Интерактивные операции недоступны


Подскажите пожалуйста: в чем проблема?

Автор: alex040269 09.09.14, 11:32

Цитата(SV71 @ 09.09.14, 11:46) http://pro1c.org.ua/index.php?act=findpost&pid=91010
&НаСервереБезКонтекста


Автор: SV71 09.09.14, 12:09

Насколько я Вас понял: неверная директива компиляции.

Попробовал совсем убрать, пробовал заменить "НаСервере" - результат та же ошибка.

Автор: Petre 09.09.14, 12:21

ОткрытьФорму()

Автор: logist 09.09.14, 12:25

Цитата(SV71 @ 09.09.14, 12:09) *
Попробовал совсем убрать, пробовал заменить "НаСервере" - результат та же ошибка.

Замените
ОСНВ_ФормаВыбора();
на
ОткрытьФорму("ПутьКФормеВыбора")

не надо создавать лишних процедур.

Автор: SV71 09.09.14, 13:58

Цитата(logist @ 09.09.14, 14:25) *
Замените
ОСНВ_ФормаВыбора();
на
ОткрытьФорму("ПутьКФормеВыбора")


Огромное спасибо!
Все получилось.
Тема закрыта.

Автор: SV71 10.09.14, 12:37

Здравствуйте!

Разрешите адресовать Вам еще один вопрос по доработке данной задачи.

Для использования в будущем единого механизма использования интерфейса выбора "Счет" решил запоминать ссылку на поле формы, откуда идет вызов, а затем по ней занести значение.

Для этого в начале модуля формы документа объявил переменную

///////////////////////////////////////////////////
//
// Назначение: Поле для занесения выбранного счета
//
// Использование:
// - устанавливается: Процедура ОперацииСчетДТНачалоВыбора
// - считывается для адресации значения: Процедура ОбработкаВыбора
//
Перем мВыборСчета;


После этого в процедурах создал код заполнения и считывания значения
//////////////////////////////////////////////////////////////////////////////
//
// Процедура ОперацииСчетДТНачалоВыбора
//
// Назначение: Вызывает интерфейс выбора "СчетДТ"
//
// Вызов: При нажатии кнопки выбора или нажатии клавиши F4 на атрибуте "СчетДТ"
//
&НаКлиенте
Процедура ОперацииСчетДТНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // ==================================================================================
    // = ВОТ ЗДЕСЬ В ОТЛАДЧИКЕ ВИДНО, КАК ЗАПОМИНАЕТСЯ =
    // ==================================================================================
    мВыборСчета = Элементы.Операции.ТекущийЭлемент;
    
    // ==========================================================
    // = Создадим форму выбора из "Справочник.НИС_Учт_Сч_Счета" =
    // ==========================================================
    фВыборСчета = ОткрытьФорму("Справочник.НИС_Учт_Сч_Счета.Форма.ФормаВыбора");
    фВыборСчета.ВладелецФормы = ЭтаФорма;
    фВыборСчета.Открыть();
    
    // ===================================
    // = Запретить стандартную обработку =
    // ===================================
    СтандартнаяОбработка = Ложь;
КонецПроцедуры // ОперацииСчетДТНачалоВыбора



//////////////////////////////////////////////////////////////////////////////
//
// Процедура ОбработкаВыбора
//
// Назначение: Заполняет выбранный "СчетДТ"
//
// Вызов: При выборе значения в подчиненной форме
//
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    // =============================
    // = Проверить источник выбора =
    // =============================
    Если ИсточникВыбора.ИмяФормы = "Справочник.НИС_Учт_Сч_Счета.Форма.ФормаВыбора" Тогда
        // = Произведен выбор из "Справочник.НИС_Учт_Сч_Счета"
        // ===================================================
        
        // ================================
        // = ТУТ ЗНАЧЕНИЕ  "Неопределено", хотя должно сохраниться "ПолеФормы" =
        // ================================
        мВыборСчета = ОбщиеМеханизмыКлиента.ПолучитьЗначение("Справочник.НИС_Учт_Сч_Счета", ВыбранноеЗначение, "Счет");
        
    КонецЕсли;  
КонецПроцедуры // ОбработкаВыбора


Когда в отладчике останавливаюсь в "Процедура ОбработкаВыбора", то значение переменной "мВыборСчета" неопределено, хотя при пошаговой отладке "Процедура ОперацииСчетДТНачалоВыбора" видно, что оно заполняется значением тип "ПолеФормы".

Наверное я неверно указываю глобальную переменную?
Подскажите как правильно?

Автор: DartRomanius 10.09.14, 12:45

С управляемыми формами, забудьте о глобальных переменных модуля. Навсегда забудьте.

Автор: alex040269 10.09.14, 13:02

Пропишите &НаКлиенте над Перем мВыборСчета; и должно заработать.

Автор: SV71 10.09.14, 13:43

Цитата(alex040269 @ 10.09.14, 15:02) *
Пропишите &НаКлиенте над Перем мВыборСчета; и должно заработать.


Спасибо, помогло по передаче параметра.

Только теперь не получается занести информацию.

Прямое обращение работает нормально:
     Элементы.Операции.ТекущиеДанные.СчетДТ = ОбщиеМеханизмыКлиента.ПолучитьЗначение("Справочник.НИС_Учт_Сч_Счета", ВыбранноеЗначение, "Счет");


Через переданный параметр типа "ПолеФормы" отрабатывает без ошибок, но значение на форму не попадает. Непонятно куда оно вообще уходит.
       // ================================
        // = ТУТ тип  мВыборСчета "ПолеФормы" =
        // ================================
        мВыборСчета = ОбщиеМеханизмыКлиента.ПолучитьЗначение("Справочник.НИС_Учт_Сч_Счета", ВыбранноеЗначение, "Счет");


Помогите пожалуйста добить вопрос.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua