1с программно заполнить составной реквизит

Составной тип программно.

Я
   Raxla

02.11.12 — 15:35

Помогите, туплю. Надо присвоить составному типу значение:

Док.ДокументОснование=источник.ссылка;

источник.ссылка имеет тип документ.ссылка, а ДокументОснование = неопределено и допускает такой тип документа.

  

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

   zak555

1 — 02.11.12 — 15:36

пустаяССылка

   vmv

2 — 02.11.12 — 15:37

гуляй Вася, такие ответы ищут в СП

   Raxla

3 — 02.11.12 — 15:37

переменная.пустаяссылка — разьве это прокатывает?

   vmv

4 — 02.11.12 — 15:39

(3) если ты тупишь не надо пытаться съесть мозг окружающим, просто смирись с первым фактом и подумай

   Undefined vs NULL

5 — 02.11.12 — 15:40

я ничего не понял

   Raxla

6 — 02.11.12 — 15:43

источник это переменная. я же не могу написать документы.источник.пустаяссылка()

   vmv

7 — 02.11.12 — 15:43

(5) да ты просто затупил, тс мастер нейропрограммирования и дипломированный мазгавдуватель если ты не понял

   Undefined vs NULL

8 — 02.11.12 — 15:43

(6) так что ты хочешь присвоить то в конце концов?

   YF

9 — 02.11.12 — 15:44

А просто = не прокатывает?

   MSII

10 — 02.11.12 — 15:45

(8) +1. ТС, сформулируй свой вопрос по-человечески

   vmv

11 — 02.11.12 — 15:45

этот топик должа была создать баба, а так пичалька

   Raxla

12 — 02.11.12 — 15:48

надо что-то вроде

ТипИст=Тип(источник);

Док.ДокументОснование=ТипИст.ПустаяССылка()

Док.ДОкументОснование=Источник.ссылка

   vmv

13 — 02.11.12 — 15:50

(12) ТипЗнч() и Новый ОписаниеТипов(…)

в принице это все что тебе надо, беги читай красные талмуды

   pessok

14 — 02.11.12 — 16:02

(13) желтые толмуды

   Serg_1960

15 — 02.11.12 — 16:06

Надеюсь к сотому посту автор внятно сформулирует вопрос, а пока рано ещё телепатировать на тему что автору на самом деле нужно.

   hhhh

16 — 02.11.12 — 16:14

(12) какая конфа? По идее жестко должны вырубаться всякие пустые ссылки и ставиться нормальное значение НЕОПРЕДЕЛЕНО.

   sikuda

17 — 02.11.12 — 16:21

В динамическом языке 1С присвоение значения происходит вместе с типом.

Док.ДокументОснование=источник.ссылка;

достаточно.

Но разные значения…

Док.ДокументОснование = Источник.ПустаяСсылка();

Док.ДокументОснование = Неопределенно;

   mrParadox

18 — 02.11.12 — 16:25

(0) Слишком много бреда для одного поста

   Serg_1960

19 — 02.11.12 — 16:34

«Док.ДОкументОснование=Источник» для автора достаточно :)

Хотя не исключено, что автор хотелспросить об ограничении типа по типу «Источник»? Как-то типа так :))

МассивТипов=Новый Массив();

МассивТипов.Добавить(Тип(«ДокументСсылка.ТребованиеНакладная»));

ЭлементыФормы.ПолеВводаХ.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов);

   Aprobator

20 — 02.11.12 — 16:38

перевожу — имеется реквизит составного типа, не получается присвоить ему значение требуемого типа, хотя он (тип) присутствует в составе.

Ответ: проверяй тип присваиваемого значения — раз,

второе: Док — точно объект?

   Raxla

21 — 15.11.12 — 00:08

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

Последние версии пробовались такие:

перем_сост_типа = ПредопределенноеЗначение(tmp.Ссылка.Метаданные().ПолноеИмя()+».ПустаяСсылка»)

перем_сост_типа = Документы[tmp.Метаданные().Имя].ПустаяСсылка()

При этом про tmp известно что это ДокументСсылка валидная для составного типа переменной «перем_сост_типа»

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

   Noroving

22 — 15.11.12 — 02:30

(21) Аш мозг расплавился). Зачес так заумно… В упр. приложении убираеш влаг у элемента «выбирать тип». и пустая ссылка пашет. в обычном не скажу, давно это было….

  

Худой

23 — 15.11.12 — 02:41

(21)По моему, без ограничения типов тут не получится.

(22) Ага, вроде, понятно чего он хочет. Но пишет так заумно…»валидность» и все такое.

Как программно установить тип реквизита

Автор Алексей_1985_06, 24 мая 2022, 20:08

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

Уважаемые товарищи, подскажите вот с таким вопросом:

1.   Создан реквизит «Комплекс» с составным типом данных (СправочникСсылка.ТехническиеКомплексы, СправочникСсылка.СтартовыеКомплексы)
2.   Созданы два реквизита формы ТК (булево) и СК (булево)
3.   Необходимо что бы при ТК = Истина,  реквизит «Комплекс» — имел тип СправочникСсылка.ТехническиеКомплексы, а при СК = Истина реквизит «Комплекс» — имел тип СправочникСсылка.СтартовыеКомплексы.

 :befhbt: Или кто подскажет может по другому как-то реализуется процесс определения типа данных реквизита в зависимости от значения другого реквизита (типа Булево)


Непонятно, зачем переустанавливать типы? У вас они уже назначены составным типом. При записи элементов справочника в этот реквизит, тип сам будет устанавливаться в нужный.
Я бы действовал в обратную сторону. При записи в реквизит «Комплекс» элемент из СправочникСсылка.ТехническиеКомплексы, присваивать ТК = Истина. А при записи СправочникСсылка.СтартовыеКомплексы — СК = Истина.


Алексей_1985_06, сильно зависит от того какие формы, управляемые или обычные, действительно, когда у реквизита составной тип
(и не два как у вас а десяток) до задалбывает каждый раз для перевыбора элемента того-же типа, сначала выбирать этот-же тип а затем и сам элемент
для избежания этого, использую такой код

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

лкТекушаяСтрока = Элементы.СсылкиДублей.ТекущиеДанные;
Если лкТекушаяСтрока <> Неопределено Тогда
Элемент.ВыбиратьТип = Не ЗначениеЗаполнено(лкТекушаяСтрока.Значение);
КонецЕсли;

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

  • 3 пользователя сказали спасибо!

если помогло нажмите: Спасибо!


LexaK, Большое Вам спасибо за помощь!!!!


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

&НаКлиенте
Процедура ДобавитьВалюту(Команда)
    
    ТС = Объект.ТЧ.Добавить();
    ТС.Имя = "Валюта";
    ТС.Значение = ПредопределенноеЗначение("Справочник.Валюты.ПустаяСсылка");
    Элементы.ТЧ.ПодчиненныеЭлементы.ТЧЗначение.ВыбиратьТип = Ложь;
    
КонецПроцедуры
 

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

Создаем справочник, имя произвольное. Добавляем табличную часть ТЧ, реквизиты Имя, тип Строка, Значение, тип составной. Для своего примера я установил Строка, Дата, Число, СправочникСсылка. В форме элемента добавляем реквизит ФормаТипы, тип ОписаниеТипов.

Остальное за нас сделает код:

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

&НаКлиенте
Процедура ДобавитьЭлементТипа(Команда)

 //определяем индекс для массива типов
 ИндексТипа = Число(СтрЗаменить(Команда.Имя, "КомандаДобавитьТипСтроки_", ""));
 сТип = ФормаТипы.Типы()[ИндексТипа];
 ТС = Объект.ТЧ.Добавить();
 ТС.Имя = Строка(сТип);
 мТипы = Новый Массив;
 мТипы.Добавить(сТип);
 //формируем новое описание типов и приводим к пустому значению этого типа
 ТипТС = Новый ОписаниеТипов(мТипы);
 ТС.Значение = ТипТС.ПривестиЗначение();
 Элементы.ТЧЗначение.ВыбиратьТип = Ложь;
 
КонецПроцедуры


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

 //при добавлении через стандартную команду формы будем выбирать тип
 Элементы.ТЧЗначение.ВыбиратьТип = Истина;
 
КонецПроцедуры
 

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

Для этого можно присвоить реквизиту формы значение пустой ссылки нужного типа. Одного из тех типов, которые входят в составной тип.

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

Объект.ОтветЛицо = ПредопределенноеЗначение("Справочник.ФизическиеЛица.ПустаяСсылка");

Если запретить выбор типа в поле ввода (свойство ВыбиратьТип), то реквизиту ОтветЛицо будет назначен тип ссылки на справочник ФизическиеЛица, и для выбора будут предлагаться значения только этого справочника.

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

Массив = Новый Массив();
Массив.Добавить(Тип("СправочникСсылка.ФизическиеЛица"));
НашеОписание = Новый ОписаниеТипов(Массив);
Элементы.ОтветЛицо.ОграничениеТипа = НашеОписание;
Объект.ОтветЛицо = НашеОписание.ПривестиЗначение(Объект.ОтветЛицо);

На чтение 7 мин Просмотров 1к. Опубликовано 10.03.2021

Содержание

  1. Страницы
  2. пятница, 3 января 2014 г.
  3. Назначить конкретный тип элементу формы, который связан с реквизитом формы, имеющим составной тип

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

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

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

Как в языке 1С работать с типами данных и как производить преобразование типов 1С?

Значение 1С Неопределено

Неопределено – это значение 1С, которое обозначает, что значения нет. С помощью этого значения 1С можно «обнулять» переменные, в том числе для неявного вызова деструктора, например COM объектов.
Переменная1 = Новый COMОбъект(«Excel.Application»);
Переменная1 = Неопределено;

Аналогичное значение 1С NULL, которое может вернуть запрос, при попытке получить данные из базы данных, если таковые получить не удалось (точнее — значение в поле NULL означает, что поле в базе данных «не заполнено»).
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Поле1 = NULL Тогда
Продолжить;
КонецЕсли;
КонецЦикла;

Типы значений 1С

В качестве «переменных» возможно использовать:

  • Переменные, созданные в тексте программы (описанными выше способами)
  • Реквизиты объекта метаданных или формы (созданными в конфигураторе, с указанием точного типа 1С).

Реквизит может иметь составной тип 1С, то есть несколько возможных. Назначение значения 1С пользователем в этом случае может быть двухэтапное:

  • Выбор типа значения 1С из доступных
  • Выбор значения 1С.

По умолчанию такой реквизит имеет значение 1С Неопределено. Когда выбран тип 1С, но еще не выбрано значение 1С – пустое значение этого типа 1С (0 для числа, пустая ссылка для ссылочных типов 1С, см. ниже). И наконец потом – значение 1С. Из программы назначения значения производится напрямую, без промежуточного выбора типа 1С.

Определить тип значения 1С возможно несколькими способами:
//способ 1 – сравнение с известными типами 1С
Переменная1 = 12;
Если ТипЗнч(Переменная1) = Тип(«Число») Тогда
//…
ИначеЕсли ТипЗнч(Переменная1) = Тип(«СправочникСсылка.ИмяСправочника») Тогда
//…
КонецЕсли;

Преобразование типов 1С

Значение 1С простых типов 1С можно преобразовывать с помощью оператора — наименования типа 1С:
//в число
ЗнчЧисло = Число(«22»); //при невозможности преобразовать типы 1С будет вызвана ошибка, поэтому лучше использовать обработчик ошибок (см. далее)

//в строку
ЗнчСтрока = Строка(22);
ЗнчСтрока = СокрЛП(22);
ЗнчСтрока = Формат(22, «ЧГ=0»);

//в дату
ЗнчДата = Дата(«20120101120000»); //01.01.2012 12:00:00
ЗнчДата = Дата(2012, 01, 01, 12, 0, 0);
ЗнчДата = Дата(2012, 01, 01);

Преобразование типов 1С — значений сложных типов 1С

Форматирование значений 1С

Для точного указания формата используется функция Формат(), с помощью которой возможно указать требуемое представление.
ЧислоСтрокой = Формат(2400, «Настройки»)

В качестве строки «Настройки» нужно указать требуемый формат 1С. Такие настройки указываются в специальном закодированном виде. Рассмотрим наиболее часто используемые настройки:

Формат 1С даты и числа по правилам различных стран
Если Вам требуется вывести дату или число и не хочется заморачиваться со знанием как они должны быть представлены по правилам нужной страны, есть простейшая настройка, которая позволит Вам это сделать:
L = КраткоеНаименованиеНужнойСтраны

Пример вывода даты по правилам некоторых стран:
Формат( ТекущаяДата(), «L=ru»)
> 28.03.2012 14:21:32
Формат( ТекущаяДата(), «L=en»)
> 3/28/2012 2:21:24 PM
Формат( ТекущаяДата(), «L=fr»)
> 28/03/2012 14:22:08

Формат даты в языке 1С
Если настройки по умолчанию Вам недостаточно и хотелось бы самостоятельно указать порядок частей даты и символы их разделения, необходимо использовать настройку:
ДФ = «дмг чмс»

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

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

Расшифровка частей даты:

  • д – день
    o маленькая «д»
    o от 1 до 4 раз
  • М – месяц
    o большая «М»
    o от 1 до 4 раз
  • г – год
    o маленькая «г»
    o 1 или 2 или 4 раз
  • ч – часы
    o маленькая «ч» — 12ти часовой формат
    o большая «Ч» — 24х часовой формат
    o 1 или 2 раза
  • м – минуты
    o маленькая «м»
    o 1 или 2 раза
  • с – секунды
    o маленькая «с»
    o 1 или 2 раза
  • вв – отображение AM/PM для 12ти часового формата
  • к – квартал.

Пример вывода даты с указанием правил:

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

Первая «проблема» связана с группировкой по умолчанию цифр в числах по 3 и разделением групп пробелом, например:
СтрЧисло = Строка(22300500)
> 22 300 500

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

Параметр, который позволяет округлить число при выводе до нужного количества цифр после запятой «ЧДЦ»:
Формат(3.535353, «ЧДЦ=»»2″»»)
> 3,54

Параметр, который позволяет указать символ-разделитель целой и дробной части «ЧРД»:
Формат(3.535353, «ЧРД=»».»»»)
> 3.535353

Для некоторых случаев бывает полезно иметь возможность вместо числа «0» отображать что-то другое: пустую строку или «не заполнено». Это позволяет делать параметр «ЧН»:
Формат(0, «ЧН=»» «»»)
>

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

Страницы

пятница, 3 января 2014 г.

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

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

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

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

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

Создаем справочник, имя произвольное. Добавляем табличную часть ТЧ, реквизиты Имя, тип Строка, Значение, тип составной. Для своего примера я установил Строка, Дата, Число, СправочникСсылка. В форме элемента добавляем реквизит ФормаТипы, тип ОписаниеТипов.

Остальное за нас сделает код:

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

  • Распечатать

Оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(0 голосов, среднее: 0 из 5)

Поделитесь с друзьями!

Показывать по
10
20
40
сообщений

Новая тема

Ответить

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

Платформа: 1С 8.2<br>Конфигурация: 1С УТ 10.3, 1С: Розница<br> <br>Описание: на форме имеется табличная часть, у которой есть некоторый реквизит. Он составной. По умолчанию я его делаю Номенклатурой и документом Установка Цен. При работе просто выбираю необходимый мне тип и заполняю значение в каждой строке.<br> <br>Вопрос: как программно назначать тип реквизиту. нужно чтобы обработка была универсальна, а для этого нужно чтобы для УТ типы были Номенклатура и становка Цен, а для Розницы Номенклатура и Установка цен в магазине (это документ). Вот собственно вопрос: можно ли программно в зависимости от того, какая конфигурация загружена, назначать тип выбираемого реквизита в таблице?<br> <br>P.S.: Прошу в ответе не учитывать метод определения конфигурации, это моя проблема и я ее решил.

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20842

«<pre>// установим тип Справочник.Контрагенты<br>МойРеквизит = Справочники.Контрагенты.ПустаяСсылка(); <br></pre>»

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

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

Prikum

активный пользователь

офлайн

Дата регистрации: 18.02.2002
Сообщений: 20842

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

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

Мозголом

Дата регистрации: 27.02.2007
Сообщений: 145

«А все, разгадал загадку. Вот такое решение я принял:<br> <br><br><pre>Процедура ТабличнаяЧасть1Реквизит1НачалоВыбора(Элемент, СтандартнаяОбработка) // Вставить содержимое обработчика. ТипСпр = Тип(«СправочникСсылка.Номенклатура»); ТипДок = Тип(«ДокументСсылка.УстановкаЦенНоменклатуры»); Если ТипЗнч(Элемент.Значение) <> ТипСпр И ТипЗнч(Элемент.Значение) <> ТипДок Тогда       Массив = Новый Массив;       Массив.Добавить(ТипСпр);       Массив.Добавить(ТипДок);       ОписаниеТипов = Новый ОписаниеТипов(Массив);       Элемент.ОграничениеТипа = ОписаниеТипов; КонецЕсли;КонецПроцедуры </pre><br><br> <br>ТипДок могу менять в зависимости от конфигурации и настроек обработки.<br> <br>Статья, где нашел примерный метод: http://v8.1c.ru/metod/faq/answer.jsp?id=176″

Показывать по
10
20
40
сообщений

  1. Всем здравствуйте! Есть справочник «ИгрокиЛотереи» с реквизитом составного типа данных «СпособОплатыЛотерей» (в составе, например: СправочникСсылка.КартаМир, СправочникСсылка.КартаМастерКард и т.д.). Важно! состав типов должен быть определён. Если для решения темы нужно будет выбрать тип значения реквизита «СпособОплатыЛотерей» в «неопределено», то мне это не подойдёт.
    Далее я имею открытую форму справочника «КартаМир», где ИгрокЛотереи — это ссылка на элемент справочника «ИгрокиЛотереи».
    Нужно программно установить тип значения поля ввода, соответствующее реквизиту «СпособОплатыЛотерей» как «СправочникСсылка.КартаМир» и присвоить данному полю ввода значение ссылки на объект открытой формы типа «СправочникСсылка.КартаМир». В модуле элемента формы справочника «КартаМир» пишу код:

    Элемент=ИгрокЛотереи.ПолучитьФорму("ФормаЭлемента").ЭлементыФормы.Найти("СпособОплатыЛотерей");
        ТипСтр="СправочникСсылка.КартаМир";
        Элемент.ОграничениеТипа=Новый ОписаниеТипов(ТипСтр);
        Значение=Элемент.Значение;
        Элемент.Значение=Элемент.ОграничениеТипа.ПривестиЗначение(Значение);
        Элемент.ВыбиратьТип=Ложь;
        Элемент.Значение=ЭтотОбъект.Ссылка;

    Вылезает ошибка:
    {Справочник.КартаМир.Форма.ФормаЭлемента.Форма(23)}: Поле объекта не обнаружено (ОграничениеТипа)
    Элемент.ОграничениеТипа=Новый ОписаниеТипов(ТипСтр);

    Прошу — помогите, пожалуйста, кто чем может.


  2. 1cUserAndrew

    Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума
    Заблокирован

    Регистрация:
    27 май 2010
    Сообщения:
    5.082
    Симпатии:
    207
    Баллы:
    104

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

  3. Этот код написан в процедуре ПриЗаписи() элемента справочника КартаМир. Табло отладчика показывает пустую строку, а ВычислитьВыражение выдаёт ошибку в выражении:
    Элем=ИгрокЛотереи.ПолучитьФорму(«ФормаЭлемента»).ЭлементыФормы.Найти(«СпособОплатыЛотерей»);

    Я переименовал на всякий случай переменную Элемент в Элем. Метод Сообщить(Элем) в данной строчке кода возвращает ПолеВвода. Должен же быть способ присвоить нужному элементу справочника данное значение..


  4. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С
    Заблокирован

    Регистрация:
    20 окт 2008
    Сообщения:
    9.541
    Симпатии:
    1.003
    Баллы:
    204

    Забудьте вы про форму, работайте с объектом напрямую.

  5. Так я вот и пытался сначала на объектном уровне писать. И вот ошибки:

    {Справочник.КартаМир.Форма.ФормаЭлемента.Форма(29)}: Поле объекта недоступно для записи (СпособОплатыЛотерей)
    ИгрокЛотереи.СпособОплатыЛотерей=ЭтотОбъект.Ссылка;

    {Справочник.КартаМир.Форма.ФормаЭлемента.Форма(29)}: Значение не является значением объектного типа (Значение)
    ИгрокЛотереи.СпособОплатыЛотерей.Значение=ЭтотОбъект.Ссылка;


  6. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С
    Заблокирован

    Регистрация:
    20 окт 2008
    Сообщения:
    9.541
    Симпатии:
    1.003
    Баллы:
    204

    Я лично вообще пока не понимаю, к чему весь этот изврат с открытыми формами, какими-то значениями в этих формах…..
    Форма — это всего лишь удобное для пользователя отображение данных БД, она хранит значения до своего закрытия.

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

    Получайте объект по ссылке ИгрокЛотереи и присваивайте значение в его реквизит:

    ТекОбъект = ИгрокЛотереи.ПолучитьОбъект();
    ТекОбъект.СпособОплаты = Ссылка;
    ТекОбъект.Записать();
    
    Последнее редактирование: 22 окт 2018
  7. Спасибо всем большое. Последние три строчки кода помогли! Я просто забыл записать изменённый объект.

Похожие темы

  1. kogor
    Ответов:
    3
    Просмотров:
    7.498


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Понравилась статья? Поделить с друзьями:
  • 1с регистр сведений измерение или реквизит
  • 1с реквизит недоступный для редактирования
  • 303 судебный участок лыткарино часы работы
  • 1с роль редактирование реквизитов объектов
  • 330 км за сколько можно проехать на машине