Передача реквизитов обработки между формами

Передача значений реквизита между между формами вн.обработки.

Я
   new1snik

18.09.13 — 08:37

Добрый день. Создаю внешнюю обработку с 2 формами и  2 реквизитами. В первой форме заполняю реквизиты, закрываю первую форму и открываю вторую. И не могу получить не то что значения этих реквизитов, не могу даже получить к ним доступ. В чем дело и что я делаю не  так, как мне получить значения реквизитов обработки во второй форме? Опять очень глупый и легкий вопрос, для кого то…

  

Партнерская программа EFSOL Oblako

   Defender aka LINN

1 — 18.09.13 — 08:39

Сейчас, погоди, хрустальный шар протру…

   Нуф-Нуф

2 — 18.09.13 — 08:40

Покажи код! Будь мужиком, блеать!

   new1snik

3 — 18.09.13 — 08:40

(1) Ладно, ведь должно было работать? Я по сути должен видеть реквизиты из обоих форм?

   new1snik

4 — 18.09.13 — 08:41

Процедура КнопкаВыполнитьНажатие(Кнопка)

    
    ДокументИнвентаризации = ОбъектДокИнвентаризации;

    СкладПоУмолчанию = ОбъектСкладПоУмолчанию;

    Если Не ДокументИнвентаризации.Ссылка.Пустая() Тогда

        Форма = ЭтотОбъект.ПолучитьФорму(«ФормаСозданияПеремещения»);

        Форма.Открыть();

        ЭтаФорма.Закрыть();

    Иначе Предупреждение(«Выберите документ инвентаризации!»);

    КонецЕсли;

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

Код первой формы

   Defender aka LINN

5 — 18.09.13 — 08:41

(3) Хрустальный шар сейчас показывает сиськи. Сиськи работать должны, факт. ИЧСХ, работают.

   new1snik

6 — 18.09.13 — 08:41

ДокументИнвентаризации, СкладПоУмолчанию это реквизиты.

   MSII

7 — 18.09.13 — 08:43

(0) Одна из этих форм — произвольная?

   Ёпрст

8 — 18.09.13 — 08:43

(0) если форма закрыта, то и реквизитов формы нема. как бэ.

   new1snik

9 — 18.09.13 — 08:44

(8) Это реквизиты не формы, а обработки.

(7) Ага

   Defender aka LINN

10 — 18.09.13 — 08:45

(6) Зато ФормаСозданияПеремещения — не форма объекта

   MSII

11 — 18.09.13 — 08:45

(9) Ну и вот. Как ты можешь в произвольной форме увидеть реквизиты ОбработкиОбъекта?

  

new1snik

12 — 18.09.13 — 08:46

(11)Вон оно что. Не знал. Спасибо!

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

Рассмотрим два способа решения этой задачи: без обращения к серверу и с обращением к серверу.

Без обращения к серверу

Создадим форму списка у справочника Номенклатура не назначая ее основной. Добавим реквизит формы ПодобранныеНоменклатуры (тип ТаблицаЗначений) и разместим соответствующий элемент формы. Для полей динамического списка ЭтоГруппа и Ссылка установим флаг ИспользоватьВсегда. Чуть позже станет понятно, для чего.

Все действия выбора будут сводиться к добавлению строки в таблицу ПодобранныеНоменклатуры элементов динамического списка. Если элемент уже был добавлен в таблицу, то увеличиваем его количество. Код обработки выбора элемента списка номенклатуры:

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    // Проверка на наличие выбранной строки в динамическом списке
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;       
    // Для групп номенклатуры подбор не производится. Именно для обращения
    // к свойству «ЭтоГруппа» был установлен флаг «Использовать всегда», иначе
    // при отсутствии колонки «Это группа» в списке вылетала бы ошибка
    // «Поле объекта не найдено»
    Если ТекущиеДанные.ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    // Отключаем стандартную обработку
    СтандартнаяОбработка = Ложь;
    // Ищем товар в таблице ПодобранныеНоменклатуры. Если нет — добавляем
    // строку, иначе увеличиваем количество
    РезультатПоиска = ПодобранныеНоменклатуры.НайтиСтроки(
        Новый Структура("Наименование", ТекущиеДанные.Ссылка)
    );
    Если РезультатПоиска.Количество() = 0 Тогда
        Строка = ПодобранныеНоменклатуры.Добавить();
        Строка.Наименование = ТекущиеДанные.Ссылка;
    Иначе
        Строка = РезультатПоиска[0];
    КонецЕсли;
    Строка.Количество = Строка.Количество + 1;
КонецПроцедуры

Форма подбора номенклатур вызывается из формы документа ПриходнаяНакладная по команде Подбор:

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

Когда в форме выбора необходимые номенклатуры подобраны, выполняется команда ПеренестиКлиент:

&НаКлиенте
Процедура ПеренестиКлиент(Команда)
    // Передаем данные выбора владельцу формы, т.е. документу ПриходнаяНакладная
    ОповеститьОВыборе(ПодобранныеНоменклатуры); 
КонецПроцедуры

Теперь подобранные номенклатуры доступны в обработчике ОбработкаВыбора элемента формы документа:

&НаКлиенте
Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Заполняем таблицу документа подобранными номенклатурами
    Для Каждого Строка Из ВыбранноеЗначение Цикл
        РезультатПоиска = Объект.Состав.НайтиСтроки(
            Новый Структура("Номенклатура", Строка.Наименование)
        );
        Если РезультатПоиска.Количество() = 0 Тогда
            НоваяСтрока = Объект.Состав.Добавить();
            НоваяСтрока.Номенклатура = Строка.Наименование;
        Иначе
            НоваяСтрока = РезультатПоиска[0];    
        КонецЕсли;
        НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество;
    КонецЦикла;
КонецПроцедуры

С обращением к серверу

Отличия в реализации подбора будут в этом случае только в передаче данных в документ и, затем, обработки подобранных номенклатур в документе. Вот таким образом будет выглядеть команда передачи данных в документ из подбора:

&НаКлиенте
Процедура ПеренестиСервер(Команда)
    // Помещаем подобранные номенклатуры во временное хранилище на
    // сервере  и получаем соответствующий адрес в нем
    Адрес = ПодготовитьДанныеПодбора();
    // Передаем владельцу формы данные выбора 
    ОповеститьОВыборе(Адрес); 
КонецПроцедуры

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

Обработчик события ОбработкаВыбора элемента формы документа:

&НаКлиенте
Процедура СоставОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Обрабатываем выбранные номенклатуры на сервере
    ОбработатьВыбранноеЗначение(ВыбранноеЗначение);
КонецПроцедуры

&НаСервере
Процедура ОбработатьВыбранноеЗначение(ВыбранноеЗначение)
    // Получаем таблицу подобранных номенклатур из хранилища
    ТаблицаПодобранныхНоменклатур = ПолучитьИзВременногоХранилища(ВыбранноеЗначение);
    // Заполняем таблицу документа подобранными номенклатурами
    Для Каждого Строка Из ТаблицаПодобранныхНоменклатур Цикл
        РезультатПоиска = Объект.Состав.НайтиСтроки(
            Новый Структура("Номенклатура", Строка.Наименование)
        );
        Если РезультатПоиска.Количество() = 0 Тогда
            НоваяСтрока = Объект.Состав.Добавить();
            НоваяСтрока.Номенклатура = Строка.Наименование;
        Иначе
            НоваяСтрока = РезультатПоиска[0];    
        КонецЕсли;
        НоваяСтрока.Количество = НоваяСтрока.Количество + Строка.Количество;
    КонецЦикла;    
КонецПроцедуры

Поиск:
1С:Предприятие • Документ • Обработка выбора • Открыть форму • Список • Справочник • Управляемая форма

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

8 Comments

  1. С одной стороны — оригинально, с другой, ни что не мешает использовать параметры — это если при открытии и функцию «Оповестить» с параметром, содержащим идентификатор открытой формы.

    Reply

  2. Да, вроде оригинально, но как-то через одно место (или только мне так показалось?).

    Reply

  3. А почему нельзя сделать намного проще, ведь хранилище используется для больших объемов данных. Можно чисто через параметры передать.

    Вот пример заполнения(расширение конфы) из Характеристик -> Спецификацию на УНФ

    &НаКлиенте
    Процедура Расш1_ЗаполнитьСпецификациюПосле(Команда)
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить(«Наименование», Объект.Наименование);
    ПараметрыОткрытия.Вставить(«СсылкаНаРодителя», Объект.Владелец);
    ПараметрыОткрытия.Вставить(«Характеристика», Объект.Ссылка);
    ОткрытьФорму(«Справочник.Спецификации.ФормаОбъекта», ПараметрыОткрытия);
    КонецПроцедуры

    В форме которая принимает прописываем:

    &НаСервере
    Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    Объект.Наименование = Параметры.Наименование ;
    Объект.Владелец = Параметры.СсылкаНаРодителя;
    Объект.ХарактеристикаПродукции = Параметры.Характеристика;
    КонецПроцедуры

    Reply

  4. Так проще:

    Вариант 1: Если требуется значение реквизитов на сервере (производятся некие серверные вычисления до открытия формы) то:

    При открытии формы нужно дополнительно передать параметр ЭтаФорма.Объект:

    ОткрытьФорму(ВернутьПутьКФормам() + «ФормаДокумента», Новый Структура(«СсылкаНаЭлемент, ЗакрыватьПриЗакрытииВладельца, ОбъектОтВладельца», ТД.Ссылка, Истина, ЭтаФорма.Объект), ЭтаФорма, ТД.Ссылка.УникальныйИдентификатор());

    тут он передается через элемент структуры ОбъектОтВладельца

    В открываемой форме (ПриСозданииНаСервере, ПриЧтенииНаСервере):

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    КопироватьДанныеФормы(Параметры.ОбъектОтВладельца, Объект);
    …
    …
    КонецПроцедуры

    Вариант 2: Если требуется значение реквизитов на клиенте (при открытии формы не требуется вызова сервера):

    При открытии формы достаточно передать владельца формы ЭтаФорма:

    ОткрытьФорму(ВернутьПутьКФормам() + «ФормаДокумента», Новый Структура(«СсылкаНаЭлемент, ЗакрыватьПриЗакрытииВладельца», ТД.Ссылка, Истина), ЭтаФорма, ТД.Ссылка.УникальныйИдентификатор());

    В открываемой форме (ПриОткрытии):

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    КопироватьДанныеФормы(ВладелецФормы.Объект, Объект);
    …
    КонецПроцедуры

    Тут все более-менее стандартно, подробнее второй вариант: http://1c-e.ru/%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0-%D1%80%D0%B5%D0%BA%D0%B2%D0%B8%D0%B7%D0%B8%D1%82%D0%BE%D0%B2­-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0-%D0%B8%D0%B7-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2/

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

    Reply

  5. (5) Спасибо, то что надо! Комментарий ценнее публикации

    Reply

  6. Комментарий в (5) — это действительно для форм одного объекта.

    А метод в статье подходит для всего, хоть для передачи во внешнюю обработку.

    Reply

  7. (7) Ага, только заголовок статьи «Передача реквизитов, данных между формами одного объекта (УФ)»

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

2 / 2 / 0

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

Сообщений: 149

1

Передача значений реквизитов между формами

30.06.2022, 11:22. Показов 1538. Ответов 14


Подскажите пожалуйста как можно передавать значения реквизитов в другую форму?
У меня есть документ Прием на работу и справочник Сотрудники. Мне нужно передавать реквизиты и их значения из Приема на работу в Сотрудники.
Нужные реквизиты для передачи в другую форму подчеркнуты

Передача значений реквизитов между формами



0



262 / 218 / 94

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

Сообщений: 1,342

30.06.2022, 18:51

2

ПараметрыФормы = Новый Структура(«МойКлюч»,МоеЗначение);
ОткрытьФорму(,,ПараметрыФормы).При открытии передаете параметры

И в событии «ПриСозданииНаСервере» открываемой формы ловите «Параметры» и дергаете из них то что надо.



0



2 / 2 / 0

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

Сообщений: 149

13.07.2022, 12:44

 [ТС]

3

Здравствуйте! Есть справочник «Сотрудники» с реквизитом «Испытательный срок» и есть документ «Прием на работу» с этим же реквизитом.
Не пойму, как можно передать записанные значения из одной формы в другую.



0



1808 / 1228 / 442

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

Сообщений: 5,395

13.07.2022, 15:05

4

cyberlohh, получитьформу с ключом ссылка на сотрудника. а там в объекте все реквизиты



0



2 / 2 / 0

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

Сообщений: 149

13.07.2022, 15:06

 [ТС]

5

Я не силен в этом. Не подскажите как это сделать?



0



cyberlohh

2 / 2 / 0

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

Сообщений: 149

13.07.2022, 15:08

 [ТС]

6

В форме документа «Прием на работу» добавил такой код

1C
1
2
3
Длительность = Объект.ДлительностьИспытательногоСрока;
    ПараметрыФормы = Новый Структура("ДлительностьИспытательногоСрока", Длительность);
    ОткрытьФорму("Справочник.Сотрудники.Форма.ФормаЭлемента", ПараметрыФормы);



0



1142 / 689 / 203

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

Сообщений: 5,159

Записей в блоге: 1

13.07.2022, 15:39

7

молодец. всё получилось?



0



2 / 2 / 0

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

Сообщений: 149

13.07.2022, 15:41

 [ТС]

8

Неа. Передача значений не осуществляется и как ее реализовать я хз.
Может, у тебя есть идеи?



0



1808 / 1228 / 442

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

Сообщений: 5,395

13.07.2022, 15:42

9

cyberlohh, см скрин

Миниатюры

Передача значений реквизитов между формами
 



0



2 / 2 / 0

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

Сообщений: 149

13.07.2022, 16:00

 [ТС]

10

Сотрудник = ПолучитьС(); выходит ошибка, что переменная с заданным именем не определена
И даже если вместо «ПолучитьС» ввести «Получить», то выходит такая же ошибка



0



1142 / 689 / 203

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

Сообщений: 5,159

Записей в блоге: 1

13.07.2022, 16:08

11

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



0



cyberlohh

2 / 2 / 0

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

Сообщений: 149

13.07.2022, 16:11

 [ТС]

12

1C
1
2
3
4
5
6
7
&НаКлиенте
Процедура Расш1_ПослеЗаписиПосле(ПараметрыЗаписи)
     Длительность = Элементы.ДлительностьИспытательногоСрока;
    Параметры = Новый Структура();
    Параметры.Вставить("ДлительностьИспытательногоСрока", Длительность);
    ПолучитьФорму("Документ.ПриемНаРаботу.ФормаДокумента",Параметры);
    КонецПроцедуры

Только это, и то выводит ошибку. Я уже совсем потерялся с этим



0



262 / 218 / 94

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

Сообщений: 1,342

13.07.2022, 17:21

13

А получитьФорму разве не должно результат возвращать?
Форма =ПолучитьФорму…



0



262 / 218 / 94

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

Сообщений: 1,342

13.07.2022, 17:23

14

Вот лично сегодня открывал форму с параметрами.Все работает.
Где они не передаются? Я не вижу кода ПРИНИМАЮЩЕГО эти параметры.



0



polax

1808 / 1228 / 442

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

Сообщений: 5,395

13.07.2022, 18:01

15

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

&НаКлиенте
Процедура Расш1_ПослеЗаписиПосле(ПараметрыЗаписи)
     Длительность = Элементы.ДлительностьИспытательногоСрока;
    Параметры = Новый Структура();
    Параметры.Вставить(«ДлительностьИспытательногоСрок а», Длительность);
    ПолучитьФорму(«Документ.ПриемНаРаботу.ФормаДокумен та»,Параметры);
    КонецПроцедуры

Выкинуть. Сделано без малейшего понимания. Да и вопрос задан неверно. Судя по попытки кода просто надо получить данные из справочника, чтобы заполнить создаваемый документ.
В событии ПриИзменении реквизита Сотрудник создаваемого документа Прием на работу (в расширении):

1C
1
2
3
4
5
6
7
8
&НаКлиенте
Процедура Расш1_СотрудникПриИзмененииПосле(Элемент)
  Объект.ДлительностьИспытательногоСрока = ПолучитьДлительность(Объект.Сотрудник)   
    КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДлительность(Сотрудник)
Возврат Сотрудник.ДлительностьИспытательногоСрока;
КонецФункции

Не по теме:

ЗЫ Зарекся отвечать на такие вопросы. По три-четыре раза в неделю одно и тоже. Но тут-то как был задан!



0



Передача данных между обычными формами 1С

Существует несколько вариантов передачи данных между формами в режиме обычного приложения 1С предприятия

Быстрый переход

  • Список способов
    • Механизм работы в первом случае:
    • Метод Оповестить() второго способа
    • Обмен через объекты-посредники:
    • Остальные методы:

Список способов

  1. Непосредственная запись в реквизиты формы
  2. Оповещение формы
  3. Оповещение владельца формы (о выборе, о записи)
  4. Оповещение подчиненным формам (об активизации строки, объекта)
  5. Оповещение об изменении
  6. Через объекты посредники (справочники, регистры сведений, файлы)

Механизм работы в первом случае:

  • получается объект типа «Форма», например через метод Справочники.Контрагенты.ПолучитьФорму () или ЭтаФорма.Владелец (если форма является подчиненной и владелец задан)
  • запись в известные заранее реквизиты формы

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

Метод Оповестить() второго способа

Является самым универсальным для обмена, поскольку предоставляет возможности:

  • Передавать сообщение всем созданным и открытым формам («широковещательное» оповещение) с подключенным событием ОбработкаОповещения
  • Передавать данные условно произвольного типа
  • Позволяет идентифицировать получателя и источника, но не ограничивает по ним
  • Работает и в формах управляемого приложения

Обмен через объекты-посредники:

  • Требует наличия объекта, доступа к нему
  • Не вызывает события изменения как и в первом случае
  • Требует периодического считывания данных для проверки
  • Позволяет передавать известные заранее типы значений

Используется, например, при организации чатов, оповещениях пользователей об обновлениях

Остальные методы:

ОповеститьОбАктивизацииОповеститьОбАктивизацииОбъекта, ОповеститьОбИзменении, ОповеститьОВыборе, ОповеститьОЗаписиНового, ОповеститьОЗаписиНовогоОбъекта  являются узкоспециализированными и односторонними (владельцу формы, подчиненным формам)

Делать деньги без рекламы может только монетный двор.

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

Рассмотрим следующую задачу: в табличной части некоторого документа есть реквизит «Пояснение» (тип строка), для удобства работы пользователей необходимо сделать так, чтобы при нажатии на кнопку «Лупа» поля ввода этого реквизита текущей строки табличной части, открывалась форма с многострочным полем ввода, где пользователь может ввести нужный ему текст. После нажатия на кнопку «Поместить» открывшейся формы вся информация из поля ввода должна быть передана в соответствующее поле текущей строки табличной части.

Для демонстрации решения, я использую учебную конфигурацию, где в табличной части документа «Поступление товаров и услуга» имеется реквизит «Пояснение» (строка (250)).

Реквизит табличной части документа

На форме документа у поля «Пояснение» таблицы формы в свойство «КнопкаОткрытия» установим значение «Да».

Свойство КнопкаОткрытия поля ввода

В результате у нас у соответствующего поля на форме появится кнопка Открыть.

Кнопка открыть на форме

Теперь создадим произвольную форму документа, которую назовем ФормаВводаПояснения.

Создание новой формы документа

У этой формы создадим реквизит управляемой формы «Ввод пояснения» (строка (250))

Создание реквизита новой формы документа

И поместим этот реквизит на форму в виде поля ввода. У поля ввода установим многострочный режим и уберем заголовок.

Свойства поля ввода формы

У командной панели формы снимем флаг «Автозаполнение»

Флаг автозаполение команды формы

Создадим команду формы «Поместить», которую разместим в командной панели формы в виде кнопки. И у этой кнопки установим флаг у свойства «Кнопка по умолчанию»

Свойство кнопка по умолчанию кнопки формы

Теперь займемся параметрами. Вполне возможно, что в нашем поле таблицы формы документа уже будет какая-то информация, поэтому её необходимо будет передать в форму ввода пояснения. Для этого на форме ввода пояснения создадим параметр ПриемникПояснения, в который, впоследствии, и будем передавать значение пояснения из формы документа.

Параметр управляемой формы

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

Событие управляемой формы ПриСозданииНаСервере

В этом обработчике напишем следующий код

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ВводПояснения = Параметры.ПриемникПояснения;

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

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

Создание обработчика команды формы

В этом обработчике мы будем закрывать форму, а в качестве параметра закрытия передадим реквизит формы.

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

Закрыть(ВводПояснения);

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

С этой формой мы закончили, перейдем к форме документа. На форме документа у поля Пояснения таблицы формы создадим обработчик события ПриОткрытии в клиентском контексте.

Создание обработчика события ПриОткрытии

Это событие возникает, когда пользователь нажимает на кнопку «Открыть» соответствующего поля.

В обработчике события, первым делом, в параметр СтандартнаяОбработка установим значение Ложь. Тогда при нажатии на кнопку открытия, не будет срабатывать стандартная обработка платформы, которая срабатывает при нажатии на эту кнопку.

&НаКлиенте
Процедура СписокТоваровПояснениеОткрытие(Элемент, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

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

Теперь в этой же процедуре нам нужно получить значение поля Пояснение текущей строки.

ТекущаяСтрока = Элементы.СписокТоваров.ТекущиеДанные;
ЗначениеПояснения = ТекущаяСтрока.Пояснение;

Это значение мы будем передавать в качестве параметра в форму ввода пояснения при её открытии. Для этого я создам структуру, где в качестве ключа будет название параметра из формы ввода пояснения (ПриемникПояснения), который мы создали в форме ввода пояснения, а в качестве значения структуры будет значение, которое мы только что получили.

ПараметрыВвода = Новый Структура("ПриемникПояснения",ЗначениеПояснения);

Открывать формы мы будем при помощи метода глобального контекста ОткрытьФорму, передадим в неё параметры ввода, а также установим, чтобы блокировалось окно владельца.

ОткрытьФорму("Документ.ПоступлениеТоваров.Форма.ФормаВводаПояснения",ПараметрыВвода,,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

&НаКлиенте
Процедура СписокТоваровПояснениеОткрытие(Элемент, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;
ТекущаяСтрока = Элементы.СписокТоваров.ТекущиеДанные;
ЗначениеПояснения = ТекущаяСтрока.Пояснение;

ПараметрыВвода = Новый Структура("ПриемникПояснения",ЗначениеПояснения);
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораПояснения",ЭтаФорма);

ОткрытьФорму("Документ.ПоступлениеТоваров.Форма.ФормаВводаПояснения",ПараметрыВвода,,,,,ОписаниеОповещения,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

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

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

На этом наше программирование закончено. Работа выполнена.

Открытие формы ввода пояснения

Другие статьи про открытие управляемых форм:

Программное открытие управляемой формы выбора

Открытие управляемой формы по верх окон

Открытие обычной формы в управляемом приложении

Открытие формы на основании другого объекта

Открытие управляемой формы существующего объекта

Открытие управляемой формы с передачей параметров

Подробно вопросы передачи параметров, открытия форм рассмотрены в книге «Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов». Эта книга станет настоящим подспорьем для тех, кто только начал знакомиться с разработкой управляемого приложения.

Книга «Основы разработки в 1С: Такси»

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

  1. Без сложных технических терминов;
  2. Более 600 страниц практического материала;
  3. Каждый пример сопровождается рисунком (скриншот);
  4. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

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

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

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

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

Привет! Есть форма обработки, а на ней поле выбора группы номенклатуры. Также, обработке есть набор значений реквизитов, которые я хочу передавать в создаваемую группу номенклатуры. Т.е. в обработке тыкаю в поле выбора номенклатуры, в открывающейся форме выбора — тыкаю создать новую группу, открывается форма группы справочника номенклатуры, в котором заполняются некоторые реквизиты, значения которых у меня есть в обработке. Не пойму, как в управляемых формах такое сделать. Разобрался как передать параметры из формы обработки в форму выбора номенклатуры — сделал так: На форме выбора номенклатуры сделал соотв. реквизиты формы и заполняю их в ПриСозданииНаСервере. Тут все работает. Но, как передавать дальше, или может есть более простой механизм?

через реквизиты формы через врем. хранилище

Хм, а с временным хранилищем есть пример кода?

Чем реквизиты формы не устраивают ?

лучше реквизитами, ВХ вроде как 20 минут всего хранится

а так — ПОместитьВОВременноеХранилище и кажись ВосстановитьИзВременногоХранилища

устраивает, так и пытаюсь сделать. в же это описано. с ВХ просто думал, что проще можно. Но, опять же как-то надо адрес на ВХ передать в форму создания новой группы. У меня сейчас трудность в том, чтобы передать значения реквизитов из формы выбора(сюда значения я уже передаю нормально) в форму группы (которую создаю)? Есть стандартная комаандная панель с командой создания новой группы — неужели команду переписывать нужно? Я думаю, что нет и должен быть простой способ решения моей задачи.

есть еще закладка Параметры <Параметры формы необходимы для организации связи между формами >

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

Из типовой копи паст работает

На закладке параметры надо вручную создавать «параметры»

Ямщик, не гони. Ты гонишь, ямщик! :)

Похоже нужна галочка — ключ параметр чтобы не грохались Вообщем похоже лучше через реквизиты формы

Такое впечатление, что в 1С что то перемудрили с параметрами. В типовых используется в 1-2 местах на сотню форм — т.е. самих же не устраивает

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Понравилась статья? Поделить с друзьями:
  • Передвижник ленинградское шоссе часы работы
  • Передовые системы производственная компания
  • Поддержка тинькофф бизнес телефон поддержки
  • Переезд какую компанию выбрать транспортную
  • Подземная парковка крокус экспо часы работы