О чем эта статья
Эта статья продолжает цикл статей «Первые шаги в разработке на 1С». В ней на практических примерах рассматривается механизм предопределенных данных, в т.ч. и в распределенной информационной базе.
Применимость
В статье рассматривается платформа 1С:Предприятие версии 8.3.4.465. Материал актуален и для текущих релизов платформы.
Предопределенные элементы в «1С:Предприятие 8.3»
При реализации алгоритмов разработчики часто опираются на определенные данные – элементы справочников, планов счетов, планов видов расчета и т.д.
Во встроенном языке существуют методы для поиска данных, например, НайтиПоКоду() или НайтиПоНаименованию().
Однако алгоритмы, опирающиеся на код или наименование, зачастую являются ненадежными.
Поскольку в пользовательском режиме код или наименование элемента справочника могут быть изменены, что может привести к неработоспособности алгоритмов.
Именно для решения этой проблемы и предназначены предопределенные данные – данные, созданные в конфигураторе, обратиться к которым возможно по имени, не прибегая к предварительному поиску элемента.
Таким образом, у предопределенных данных есть две “стороны”: во-первых, существует список предопределенных элементов, созданный в конфигураторе, а, во-вторых, для данных информационной базы указывается, является ли конкретный элемент предопределенным.
Предопределенные элементы могут быть созданы у:
- справочников;
- планов счетов;
- планов видов характеристик;
- планов видов расчета.
В статье рассмотрены новшества, касающиеся предопределенных данных на платформе 8.3, а также особенности работы с ними в распределенных базах (как центральных, так и периферийных) и в информационных базах в режиме разделения данных.
Для примера, создадим в справочнике Организации предопределенный элемент ОсновнаяОрганизация:
Для увеличения нажмите на изображение.
Обращение к этому элементу из программного кода будет следующим:
В платформе 8.3 реализована возможность связать предопределенные данные с элементами соответствующего типа.
Для этого у объектов, которые могут иметь предопределенные элементы (они указаны выше), добавлено новое свойство ИмяПредопределенныхДанных. Оно отображается в списке стандартных реквизитов:
Выберем при помощи запроса все поля из справочника Организации:
Для увеличения нажмите на изображение.
На рисунке видно, что в поле ИмяПредопределенныхДанных указан именно тот идентификатор, который мы ввели в режиме конфигуратора.
Предопределенный элемент в списке отображается специальной пиктограммой:
Чтобы “отсоединить” элемент данных от элемента предопределенных данных, нужно присвоить свойству ИмяПредопределенныхДанных пустую строку и записать элемент:
Процедура Отсоединить(Команда)
ОтсоединитьНаСервере();
КонецПроцедуры &НаСервереБезКонтекста
Процедура ОтсоединитьНаСервере()
ОбъектДанных = Справочники.Организации.ОсновнаяОрганизация.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = “”;
ОбъектДанных.Записать();
КонецПроцедуры
Пиктограмма в списке изменилась:
Теперь предопределенный элемент существует только в конфигурации и в данных нет элемента, привязанного к идентификатору ОсновнаяОрганизация:
Для увеличения нажмите на изображение.
Обращение из программного кода к предопределенному элементу вызовет исключение:
Чтобы связать предопределенный элемент с новой записью, нужно присвоить свойству ИмяПредопределенныхДанных имя предопределенного элемента:
Процедура Привязать(Команда)
ПривязатьНаСервере();
КонецПроцедуры &НаСервереБезКонтекста
Процедура ПривязатьНаСервере()
НайденнаяСсылка = Справочники.Организации.НайтиПоНаименованию(“ООО “”Товары”””);
ОбъектДанных = НайденнаяСсылка.ПолучитьОбъект();
ОбъектДанных.ИмяПредопределенныхДанных = “ОсновнаяОрганизация”;
ОбъектДанных.Записать();
КонецПроцедуры
Теперь с пиктограммой предопределенного элемента выводится другой элемент справочника:
При записи объекта проверяется, не существует ли в информационной базе другого элемента данных с таким же идентификатором предопределенных данных.
В случае его обнаружения будет выдано сообщение об ошибке:
При помощи запроса обратимся к полю ИмяПредопределенныхДанных.
Запрос.УстановитьПараметр(“ИмяПредопределенныхДанных”, ИмяПредопределенныхДанных); Запрос.Текст =
“ВЫБРАТЬ
| Организации.Ссылка,
| Организации.Наименование,
| Организации.Код
|ИЗ
| Справочник.Организации КАК Организации
|ГДЕ
| Организации.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных”; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = Выборка.Наименование;
Сообщение.Сообщить();
КонецЕсли;
Если параметр запроса ИмяПредопределенныхДанных принимает значение “ОсновнаяОрганизация”, запрос выполняется без ошибок.
Если используется любое другое значение, не указанное в конфигураторе, то во время выполнения произойдет исключение:
При использовании в конфигурации Библиотеки стандартных подсистем (БСП) версии 2.1.4 и выше рекомендуется использовать функцию ПредопределенныйЭлемент общего модуля ОбщегоНазначенияКлиентСервер, которая возвращает Неопределено для несуществующих в информационной базе предопределенных элементов:
ОсновнаяОрганизация”);
Платформа позволяет получить список только предопределенных элементов, присутствующих в данных. Это можно сделать, например, при помощи запроса.
ОбъектДанных= Метаданные.Справочники.Организации;
ТекстЗапроса = ”
|ВЫБРАТЬ
| ИмяОбъекта.Ссылка
|ИЗ
| “ + ОбъектДанных.ПолноеИмя() + ” КАК ИмяОбъекта
|
|ГДЕ
| ИмяОбъекта.Предопределенный;
Запрос = Новый Запрос(ТекстЗапроса);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ИмяПредопределенного = Справочники[ОбъектДанных.Имя].ПолучитьИмяПредопределенного
(Выборка.Ссылка);
Сообщить(ИмяПредопределенного);
КонецЦикла;
Получение списка предопределенных элементов, заданных в метаданных, при помощи встроенного языка – невозможно.
Однако начиная с платформы 8.3.3, метод ПолучитьИмяПредопределенного() является устаревшим и поддерживается для совместимости, поэтому даже в Синтакс-помощнике платформы 8.3.4 он не отображается.
В платформе 8.3 существует метод глобального контекста ПолучитьПолноеИмяПредопределенногоЗначения(). Этот метод выполняет действие, обратное методу ПредопределенноеЗначение(), – по ссылке на предопределенный элемент возвращает полное имя предопределенного значения.
В платформе 8.3 разрешено помечать предопределенные данные на удаление и производить удаление предопределенных данных. Если же удаление предопределенных элементов в разрабатываемой конфигурации недопустимо, то следует настроить права доступа.
Теперь в платформе присутствуют новые права доступа, определяющие возможность редактирования предопределенных данных:
- ИнтерактивноеУдалениеПредопределенныхДанных,
- ИнтерактивнаяПометкаУдаленияПредопределенныхДанных,
- ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных,
- ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных.
Ограничения доступа к данным одновременно назначаются на поля Предопределенный и ИмяПредопределенныхДанных (оба флажка устанавливаются и снимаются одновременно):
Однако “интерактивные” права на просмотр и редактирование стандартных реквизитов Предопределенный и ИмяПредопределенныхДанных можно установить по отдельности:
Для увеличения нажмите на изображение.
Для корректного функционирования системы необходимо, чтобы предопределенные элементы не только были созданы в конфигураторе, но и в данных информационной базы существовали связанные с ними элементы.
Для указания стратегии создания или изменения предопределенных данных было реализовано системное перечисление ОбновлениеПредопределенныхДанных, содержащее следующие значения:
- Авто – необходимость создания предопределенных элементов и обновление существующих будет определяться системой автоматически;
- НеОбновлятьАвтоматически – не будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений. В случае отсутствия элемента данных, связанного с предопределенным элементом, будет сгенерировано исключение при попытке обращения к нему;
- ОбновлятьАвтоматически – будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений.
Чтобы принять решение, нужно ли создавать и обновлять предопределенные данные, система последовательно анализирует следующие значения:
- значение, установленное для объекта в данных;
- значение, установленное для объекта метаданных в конфигураторе;
- значение, установленное в целом для информационной базы;
- вид информационной базы – центральная (либо не распределенная база) или периферийная база.
Обратите внимание на первые два пункта. При некотором внешнем сходстве формулировок между этими пунктами есть принципиальная разница: второе значение устанавливается разработчиком для объекта метаданных в конфигураторе, а первое хранится в данных информационной базы.
Подробнее будет рассмотрено ниже.
Такое большое количество анализируемых значений было реализовано для возможности полноценно управлять созданием и обновлением предопределенных данных.
Например, в периферийной базе предопределенные данные не должны создаваться автоматически, а в случае отключения базы от РИБа нельзя допустить автоматического создания элементов.
Кроме того, разработчик в зависимости от логики прикладного решения должен иметь возможность управлять процессом создания предопределенных элементов.
Теперь рассмотрим последовательность действий, которые выполняет система, чтобы определить, нужно ли создавать или обновлять предопределенные данные.
1. Если для объекта метаданных в информационной базе (т.е. в данных) установлен режим обновления, отличный от Авто, то используется это значение.
Получить и установить значение этого свойства для каждого объекта метаданных в пользовательском режиме можно с помощью методов ПолучитьОбновлениеПредопределенныхДанных() и
УстановитьОбновлениеПредопределенныхДанных().
Эти методы доступны у объектов типа СправочникМенеджер, ПланСчетовМенеджер, ПланВидовХарактеристикМенеджер, ПланВидовРасчетаМенеджер.
Следует учитывать, что метод УстановитьОбновлениеПредопределенныхДанных() невозможно использовать во время фоновой реструктуризации базы.
2. Иначе если для объекта метаданных в конфигурации установлен режим обновления, отличный от Авто, то используется это значение.
3. Иначе если для информационной базы установлен режим обновления, отличный от Авто, то используется это значение.
Получить и установить значение этого свойства для каждого объекта метаданных в пользовательском режиме можно с помощью методов ПолучитьОбновлениеПредопределенныхДанныхИнформационнойБазы() и УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы().
4. Иначе анализируется вид узла распределенной базы. Если это периферийный узел, то предопределенные данные не будут обновлены (соответствует значению НеОбновлятьАвтоматически).
Если проверка выполняется для центрального узла распределенной базы или для базы, не являющейся распределенной, обновление предопределенных данных будет выполнено (соответствует значению ОбновлятьАвтоматически).
Если база находится в режиме совместимости “Версия 8.3.3”, то алгоритм определения необходимости обновления предопределенных данных выглядит немного по-другому.
Обновление не будет производиться:
- если в метаданных или в данных установлено НеОбновлятьАвтоматически;
- если в метаданных или в данных установлено Авто и текущий узел является периферийным.
В противном случае предопределенные данные будут обновлены.
Создание в информационной базе данных, связанных с предопределенными, может быть выполнено следующими способами:
1. При реструктуризации информационной базы в случае, когда разрешено автоматическое создание и обновление предопределенных данных, а также предопределенные данные ранее создавались в этой области данных или информационной базе.
2. При первом обращении к таблице с данными объекта конфигурации. Создание предопределенных элементов будет выполняться при условии, что их создание не запрещено.
3. С помощью кода на встроенном языке, в котором заполняется значение свойства ИмяПредопределенныхДанных. Этот способ можно использовать, если автоматическое создание предопределенных элементов запрещено в свойствах объектов конфигурации.
Обновление данных, связанных с предопределенными, будет выполняться, если:
- разрешено автоматическое обновление предопределенных данных;
- предопределенные данные связаны с данными информационной базы;
- предопределенные данные изменены в конфигураторе.
Во всех остальных случаях информация о предопределенных элементах из конфигуратора не будет перенесена в информационную базу.
Если в конфигураторе удалить предопределенный элемент, то будут выполнены следующие действия:
- элемент данных, связанный с предопределенным элементом, будет помечен на удаление;
- в списке субконто элемента плана счетов будут удалены соответствующие записи;
- в списках ведущих, базовых и вытесняющих видов расчета будут удалены соответствующие записи.
Установим для справочника Организации в конфигураторе свойство ОбновлениеПредопределенныхДанных в НеОбновлятьАвтоматически и удалим предопределенный элемент ОсновнаяОрганизация.
В пользовательском режиме у элемента справочника, связанного с предопределенным, значение свойства ИмяПредопределенныхДанных стало равным #708c7031-c7bd-45d4-a8c9-65b2fecfde62, где символы после знака “#” – это уникальный идентификатор удаленного элемента метаданных.
Для увеличения нажмите на изображение.
При использовании распределенной информационной базы предопределенные элементы из конфигурации передаются вместе с сообщением, содержащим изменения конфигурации.
А элементы данных, связанные с предопределенными, регистрируются в планах обмена так же, как и обычные данные.
Автоматического создания предопределенных данных в периферийной базе не происходит.
В распределенной базе иногда могут возникать ошибки, которые исправляются после отключения от РИБа, загрузки в периферийную базу конфигурации центральной базы и дальнейшего подключения к распределенной базе.
При работе на платформе 8.3 следует учитывать следующую особенность.
База, у которой главный узел стал не установлен (базу отключили от РИБа), не является периферийной, поэтому при запуске этой базы в пользовательском режиме может произойти обновление предопределенных данных согласно алгоритму, описанному выше.
Чтобы не допустить такого поведения, можно использовать метод глобального контекста УстановитьОбновлениеПредопределенныхДанныхИнформационнойБазы() или использовать параметр командной строки в пакетном режиме запуска конфигуратора /SetPredefinedDataUpdate, который предназначен для указания режимов обновления предопределенных данных.
Этот параметр может принимать одно из трех значений:
- UpdateAutomatically – при реструктуризации информационной базы будет выполняться автоматическое создание предопределенных элементов и обновление существующих значений;
- DoNotUpdateAutomatically – при реструктуризации информационной базы не будет выполняться автоматическое создание новых предопределенных элементов и обновление их значений;
- Auto – фактическое значение вычисляется автоматически. Для главного узла информационной базы значение будет равно UpdateAutomatically, для периферийного узла информационной базы будет равно DoNotUpdateAutomatically.
Командная строка запуска конфигуратора с этим параметром будет выглядеть следующим образом:
“C:\Program Files\1cv8\8.3.4.437\bin\1cv8.exe DESIGNER /F”ПутьКБазе” /N”Администратор” /P”Пароль” /SetPredefinedDataUpdate -DoNotUpdateAutomatically”
Таким образом возможно задавать признак обновления предопределенных данных, когда информационная база отключается от РИБ, например, для восстановления работоспособности.
Так же можно поступить в случае, если с помощью обмена без использования РИБ взаимодействуют две конфигурации, где предопределенные данные задаются в одной базе, а в другую они должны попасть после обмена.
Для информационной базы, где создаются предопределенные элементы, следует использовать значение UpdateAutomatically, а для второй информационной базы – DoNotUpdateAutomatically.
В платформе 8.3 для объектов конфигурации, которые могут содержать предопределенные данные (справочники, планы счетов, планы видов характеристик, планы видов расчета), реализована возможность устанавливать свойство ИмяПредопределенныхДанных в значение специального вида, состоящее из символа “#” и текстового представления уникального идентификатора.
Таким образом можно создавать обработки загрузки предопределенных данных из файла.
В платформе 8.2.14 появился механизм разделения данных. При использовании разделенной базы предопределенные элементы создавали ряд ограничений.
Так, было невозможно использовать предопределенные данные для объектов конфигурации, входящих в состав разделителя в режиме “Независимо и совместно”.
Теперь в платформе 8.3 предопределенные данные можно использовать для объектов, входящих в состав любых разделителей.
Ссылки на предопределенные элементы более не являются одинаковыми, в том числе и в различных областях (даже для объектов, входящих в состав разделителя в режиме Независимо).
Например, рассмотрим предопределенный элемент ОсновнаяОрганизация в справочнике Организации.
Пусть в базе есть две области: с кодами 01 и 02.
Значит, уникальный идентификатор элемента данных, связанного с элементом ОсновнаяОрганизация в области с кодом 01, не будет равен уникальному идентификатору элемента данных, связанного с элементом ОсновнаяОрганизация в области 02.
Подведем итоги. Рассмотрим, для чего было внесено столько нововведений в работу с предопределенными данными.
Прежний вариант использования предопределенных элементов накладывал ограничения при работе в режиме разделенной информационной базы.
Так, невозможно было использовать предопределенные данные для объектов конфигурации, входящих в состав разделителя в режиме “Независимо и совместно”. Невозможно было связать существующий объект данных с предопределенными данными.
Один предопределенный элемент имел одинаковую ссылку во всех областях данных.
При обмене данными с использованием РИБа предопределенные данные передавались только с изменениями конфигурации прикладного решения. Управлять созданием и обновлением предопределенных данных было невозможно.
Таким образом, рассмотренные нововведения направлены на развитие возможностей платформы по работе в режиме разделенной информационной базы, что особенно актуально в рамках модели SaaS (“программы как сервис”), которую также называют работой “в облаке”.
На этом мы завершаем наше первое знакомство с предопределенными элементами.
Вы, скорее всего, уже заметили, что основное время во время написания программного кода мы находились в конфигураторе. И, наверное, вы уже задавались вопросом, что значат все эти кнопки, панели и меню в нем. Когда и зачем их нужно использовать?
Пока мы обходили стороной все эти вопросы, набирая необходимую базу знаний для старта. Теперь же, кажется, самое время изучить конфигуратор более подробно, и в этом вам поможет наша следующая статья.
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.
Статья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Ссылка доступна для зарегистрированных пользователей)
Добрый день!
В плане счетов в конфигураторе созданы нужные счета и прописаны субконто для оных
В пользовательском режиме – принудительно очищены субконто в плане счетов
После обновления конфигурации не все счета получили предопределённые субконто
Есть ли возможность получить установленные субконто у предопределённых счетов кодом
либо принудительно обновить субконто по всем счетам?
Например: ПланыСчетов.Хозрасчетный.АмортизацияОС_01.ВидыСубконто – получает субконто настроенные пользователем
Хотелось бы получить предопределнные данные через код, типа так: Метаданные.ПланыСчетов.Хозрасчетный.ВидыСубконто
Добрый день!
Предлагаю 2 варианта:
1. В конфигураторе открыть список предопределенных элементов, сохранить его в табличный документ (контекстное меню – Вывести список), затем программно обработать табличный документ.
2. В конфигураторе в меню выполнить команду Конфигурация – Выгрузить конфигурацию в файлы.
На диске сформируется набор папок и файлов. Нас интересует файл ChartsOfAccounts\ИмяПланаСчетов\Ext\Predefined.xml
В нем есть информация о всех предопределенных счетах и их субконто. Можно программно обработать XML-файл, получить из него нужную информацию.
Спасибо за идеи
Получается, что достучаться до предопределенных субконто у счета штатными средствами 1С нет возможности.
Здравствуйте! Получение предопределенного элемента справочника – это запрос к СУБД? Например вот такой код (где ЗаказВыкуплен – предопределенный элемент):
Пока Выборка.Следующий() Цикл
Заказ = Выборка.ЗаказКлиента.ПолучитьОбъект();
Заказ.Статус = Справочники.СтатусыЗаказовКлиентов.ЗаказВыкуплен;
Заказ.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла
это запрос в цикле или нет?
Добрый день!
Смоделировал такую ситуацию, настроил ТЖ. По логам обнаружил, что на каждой итерации цикла не выполняется запрос к справочнику для получения предопределенного элемента.
Спасибо! Вероятно один раз запрашивается, а затем в кэш помещается и после оттуда берется
Подскажите пожалуйста, правильно ли я понимаю, что создать новый предопределенный элемент в справочнике не получиться. Есть возможность только позаимствовать существующее ИмяПредопределенных для нового элемента, оставив другой без него.
Задача была создать элемент в справочнике и сделать его предопределенным программно.
Об = Объект.ЭлементОбработки.ПолучитьОбъект();
Об.ИмяПредопределенныхДанных = Объект.ИмяПредопределенных;
Об.Записать();
Ошибка:
по причине:
Предопределенный элемент не существует
Добрый день!
Да, правильно, можно “перенести” признак предопределенного с одного элемента на другой. ИмяПредопределенныхДанных в программном коде можно использовать только то, которое было создано в конфигураторе.
Предопределённые элементы в Метаданных имеют УникальныйИдентификатор? Или связь с информационной базой только по строковому имени?
Добрый день!
Да, предопределенные элементы имеют уникальный идентификатор. Выгружаю конфигурацию в файлы в конфигураторе. Для справочника Валюты, содержащего предопределенный элемент, формируется файл Predefined.xml. В нем содержится идентификатор предопределенного элемента.
Здраствуйте! ищу по интернету вариант который поможет написать код удаляющий сгенерированные прежде элементы из всех групп справочника «Номенклатура»
Добрый день!
Вариант без программирования – пометьте их на удаление, затем удалите помеченные объекты. Это самый простой способ.
Вариант с написанием обработки посложнее – запросом выбираете нужные Вам элементы из справочника Номенклатура, обходите в цикле выборку из результата запроса, на каждой итерации цикла получаем СправочникОбъект, удаляем его:
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| //Ваше условие";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СпрОбъект = Выборка.Ссылка.ПолучитьОбъект();
СпрОбъект.Удалить();
КонецЦикла;
Не забывайте про ссылочную целостность при удалении данных. Например, номенклатура может уже быть выбрана в документах, такую номенклатуру нельзя удалять.
Возникла задача, необычного характера. Конфигурация ( не на БСП), распределенная база. Обмен осуществляется только по ряду справочников. Грубо говоря главная база – это общие каталоги нормативной информации. Только в ней можно создавать новые элементы у части справочников. К примеру справочник номенклатура можно редактировать только в главной базе. А справочник клиенты – могут редактировать в любых периферийных базах. Из главной базы данные только выгружаются в периферию. Столкнулись с интересным эффектом, т.к. не все данные участвуют в обмене, то на них не создаются предопределенные данные. А хотелось бы. На ум приходит только выгрузка списка предопределенных значений в сообщение обмена, с именем предопределенных данных и ссылкой, и обработка при загрузке. Как можно решить эту задачу по другому?
Добрый день!
Можно для определенных таблиц информационной базы установить обновление предопределенных данных в периферийном узле РИБ. Для этого можно создать обработку или при начале работы системы выполнить вот такой код:
Справочники.Справочник1.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
КонецЕсли;
Здесь мы проверяем, что это действительно периферийный узел нужного нам плана обмена, а также у нас хватает прав, в этом случае включаем автоматическое обновление предопределенных данных в нужных справочниках, которыми не обмениваемся с главным узлом.
Также в статье указано, что создание в информационной базе данных, связанных с предопределенными, выполняется при первом обращении к таблице с данными объекта конфигурации. Поэтому может получиться, что даже после выполнения данного кода предопределенные элементы в справочнике не появились. Тогда нужно выполнить реструктуризацию информационной базы при помощи конфигуратора, в статье этот момент тоже отражен.
Или еще вариант:
– Включить автоматическое обновление предопределенных данных на уровне информационной базы (УстановитьАвтоматическоеОбновлениеПредопределенныхДанныхИнформационнойБазы).
– В периферийных узлах для объектов, которые участвуют в обмене, выключить автоматическое обновление предопределенных данных.
помогло, спасибо,
поиск по коду – ищет “первый” счет…
КодСчета=”10.03″;
ОбъектДанных = ПланыСчетов.Хозрасчетный.НайтиПоКоду(КодСчета).ПолучитьОбъект();
+ надо ещё отключать предопределенность у субконто
ОбъектДанных.ВидыСубконто[0].Предопределенное = ЛОЖЬ;
Возможно, проблема со счетом 10.03 “Топливо” связана с новшествами, появившимся в релизе 3.0.74.
В этой версии был реализован учет путевых листов, поэтому в конфигурации появились предопределенные счета 10.03.1 “Топливо на складе” и 10.03.2 “Топливо в баке”. А 10.03 – это теперь группа счетов.
в 1С 8.3 Бухгалтерия предприятия 3.0 – после переноса из БП 2.0 как то появились дубли счетов 08.01, 10.03 и др. – оба дубля предопреденные …. а в конфигураторе только 1 счет…
как удалить 1 из дублей ?
Добрый день!
Проверьте для проблемных счетов, какие значения принимают свойства ИмяПредопределенныхДанных и Предопределенный.
При помощи фрагмента кода из статьи можно изменить счет:
ОбъектДанных.ИмяПредопределенныхДанных = "";
ОбъектДанных.Записать();
После этого можно будет удалить задвоившийся счет.
Большое спасибо, статья помогла!! Применяла на справочнике “Организации”
Есть где-нибудь подробное описание внутренних механизмов работы платформы с предопределенными элементами. Запоминается ли где-нибудь внутри ИБ “статус” предопределенного элемента и т.п.?
Поясню на примере: РИБ, подчиненный узел, справочник, обновление предопределенных данных = авто. Сбрасываем главный узел, загружаем конфигурацию, обновляем – новый предопределенный элемент должен создаться? Далее, допустим не создался. Удаляем в конфигурации предопределенный элемент, затем опять загружаем конфигурацию, обновляем – новый предопределенный элемент должен создаться?
Добрый день!
Для предопределенных элементов есть внутренний идентификатор. Он используется, например, при сравнении-объединении конфигураций. Т.е. если удалить в конфигураторе предопределенный элемент и создать его еще раз заново с тем же кодом и с тем же наименованием, то для системы это будет другой элемент.
Должно вот в такой последовательности должно корректно работать переподключения базы к РИБ:
1. База отключается от РИБ. Программным кодом отключается автоматическое обновление предопределенных данных.
2. Загружается конфигурация из центральной базы. Пока не обновляем конфигурацию БД.
3. Запускаем в пользовательском режиме, не обновляем конфигурацию БД. Обработкой подключаем к РИБ – устанавливаем главный узел.
4. Обновляем конфигурацию БД. Запускаем в пользовательском режиме, должны сработать обработчики обновления.
Добрый день.
Объясните пожалуйста эту фразу: “Программным кодом отключается автоматическое обновление предопределенных данных.”. То есть в момент отключения от РИБ кроме сброса центрального узла необходимо еще во всех метаданных с помощью кода отключить автоматическое обновление предопределенных данных? Или платформа делает это сама?
Добрый день!
Нет, платформа сама это не делает.
Можно создать внешнюю обработку, в которой при нажатии на кнопку выполнить следующий код:
Здравствуйте,
в статье “…Таким образом можно создавать обработки загрузки предопределенных данных из файла”.
Вопрос: уточните, пожалуйста, какой должен быть код обработки, для создания в базе предопределённых счетов (чтобы они создались в конфигураторе соответственно)?
База не РИБ, у плана счетов выбрано “Обновлять автоматически”
Спасибо
Добрый день!
Из пользовательского режима обработкой создать предопределенный элемент в конфигураторе не получится, т.к. это по сути не только данные, но и метаданные.
Обработкой в пользовательском режиме можно назначить предопределенным тот или иной элемент справочника. Или можно заменить предопределенный элемент – в пользовательском режиме элемент №1 был предопределенным, его сделать “обычным”, а предопределенным назначить элемент №2.
Для этого программно работаем со свойством ИмяПредопределенныхДанных:
Утверждение “Получение списка предопределенных элементов, заданных в метаданных, при помощи встроенного языка – невозможно.” уже устарело. Есть ПолучитьИменаПредопределенных(), которая решает эту задачу. Также можно вывалить предопределённые в макет и его обработать, либо выгрузить конфу и прочитать хмл-файл, но эта функция лучше всего.
Добрый день!
Да, всё верно. Ранее в комментариях обсуждали этот момент.
добрый день.
у меня не очень классическая ситуация и связан он с обменом. имеется 2 конфигурации 8.3 (платформа 8.3.10 без режима совместимости) и 8.2. в них обменивается справочник, который содержит предопределенные элементы и собственно вопрос как настроить обмен между ними корректно на ваш взгляд?
Добрый день!
Например, при помощи Конвертации данных. В ней можно настроить соответствие предопределенных элементов в обменивающихся конфигурациях.
Добрый день, коллеги!
Столкнулись со следующей проблемой:
При обновлении на новую конфигурацию бухгалтерии 3.0, в новом обновлении фирма 1С добавила, предопределенный счет 19.10, но у нас в конфигурации уже данный счет есть, при обновлении появились ошибки, что счет 19.10 уже существует в конфигурации (добавлен в режиме 1С) и код планов счетов стал не уникальным.
Как быть в этой ситуации?
Возможные варианты вижу следующие:
1. Переименовать наш счет из 19.10 в 19.11 до обновления. Но тогда во всех документов, которые использовались до этого и проводках счет поменяет представление с 19.10 на 19.11;
2. У предопределенного счета поменять код на 19.11 и подправить типовой код по заполнению бухгалтерской отчетности где используется условие на код счета (типовой функционал). Но в этом случае при последующих обновлениях всегда придется отслеживать данные изменения связанные с с условиями на код счета.
Что вы можете посоветовать в этой ситуации?
В заранее спасибо.
Добрый день!
Главное – выполнять обновление через поддержку, а не через сравнение-объединение. Дело в том, что для платформы предопределенные элементы идентифицируются не кодом или названием, а внутренним уникальным идентификатором. И при сравнении-объединении идентификаторы могут меняться.
После обновления в пользовательском режиме можно поменять коды счетов. Самый простой вариант – вариант №1, попробуйте поговорить с бухгалтерией.
1с Бухгалтерия 3.0 Я в конфигураторе добавил субконто к счету 50.02. Затем решил использовать другое субконто. В предприятии получилось 2 субконто новое и старое. Удаляю в конфигураторе все субконто счета 50.02 В предприятии так 2 и остались. База у меня не распределенная. Соответственно, при изменении субконто предопреденного счета в конфигураторе, он должен меняться автоматически в предприятии. Что я делаю не так?
Добрый день!
Нет, в пользовательском режиме можно изменять состав субконто на счете. Поэтому нужно в режиме “1С:Предприятие” установить требуемый состав субконто для счета.
На 50 счетах не доступны в пользовательском режиме изменения.
Значит, нужно будет обработкой поправить, но в пользовательском режиме. Либо в конфигурации разрешить ручное изменение списка субконто на этих счетах.
Все разобрался. Одна из побочных ситуаций предопределенных объектов. Надо исключить 50 счет из запрещенных к редактированию в предприятии. В модуле счета исключил 50 счет и отредактировал субконто. Вот здесь.
УчетДвиженияДенежныхСредств = Новый Массив(6);
УчетДвиженияДенежныхСредств[0] = ПланыСчетов.Хозрасчетный.Касса; // 50
УчетДвиженияДенежныхСредств[1] = ПланыСчетов.Хозрасчетный.РасчетныеСчета; // 51
УчетДвиженияДенежныхСредств[2] = ПланыСчетов.Хозрасчетный.ВалютныеСчета; // 52
УчетДвиженияДенежныхСредств[3] = ПланыСчетов.Хозрасчетный.СпециальныеСчета; // 55
УчетДвиженияДенежныхСредств[4] = ПланыСчетов.Хозрасчетный.ПереводыВПути; // 57.01
УчетДвиженияДенежныхСредств[5] = ПланыСчетов.Хозрасчетный.ПереводыВПутиВал; // 57.21
УчетДвиженияДенежныхСредств = БухгалтерскийУчет.СформироватьМассивСубсчетов(УчетДвиженияДенежныхСредств);
УчетДвиженияДенежныхСредств = ОбщегоНазначенияКлиентСервер.СократитьМассив(УчетДвиженияДенежныхСредств, СчетаИсключения);
Отлично, что разобрались!
Здравствуйте! спасибо за статью, статья замечательная. Но столкнулась с проблемой(( делаю внешнюю обработку, что бы “отсоединить” элемент данных от элемента предопределенных данных, а потом связать предопределенный элемент с новой записью. Скопировала ваш код, но у меня выходит ошибка: Поле объекта не обнаружено (ИмяПредопределенныхДанных)ОбъектДанных.ИмяПредопределенныхДанных = “”; В чем может быть проблема?((
Добрый день!
Либо старая версия платформы, которая еще не поддерживает эти возможности, либо режим совместимости конфигурации, с которым не работает этот функционал.
Здравствуйте! Хочу сделать предопределённый объект в справочнике “Пратнёры” в 1C:ERP 2.2 непредопределённым, чтобы затем удалить его (мне “Розничный покупатель” совсем не нужен). Скажите пожалуйста, куда вписывать код, который Вы привели выше (после слов: “… нужно присвоить свойству ИмяПредопределенныхДанных пустую строку и записать элемент: …”)?
И нужно ли писать оба абзаца (для Клиента и для Сервера), если ERP у меня стоит на съёмном диске полностью (толстый клиент) без всяких внешних серверов?
Потому что если поставить все четыре “галки” в Конфигураторе, как показано выше на рисунке с “Правами” (Интерактивные удаления и пометки), то в пользовательском режиме всё равно не удалить этот элемент.
Добрый день!
Нужно создать внешнюю обработку, открыть форму обработки. На форме создать команду, вынести ее на форму. Мы получим кнопку. Нужно реализовать обработчик – что именно система будет делать при нажатии на кнопку.
Приведенный программный код как раз и будет выполняться при нажатии на кнопку (выполнении команды). Сначала работаем на клиенте, но поскольку требуется работа с данными, переходим в серверную процедуру, где и происходит работа с элементом справочника.
Даже если мы работаем в файловом варианте без сервера “1С:Предприятие”, нужно разделять код на клиентские и серверные методы. Это особенность работы с управляемыми формами.
Василий, большое спасибо! Самому сделать это мне кажется сложноватым, внешних обработок я ещё не создавал … Но я увидел в Конфигураторе, что если в справочнике “Партнёры” щёлкнуть ПКМ по “Открыть предопределённые данные” – открывается окно со всеми тремя предопределёнными партнёрами. При этом активна опция “удалить” в меню выше. Нельзя ли так избавиться от них? Это будет намного проще. Пробовать самостоятельно не хочу – хотелось бы прежде услышать Ваше мнение.
Не стоит удалять в конфигураторе предопределенные элементы. В программном коде есть обращения к этому элементу. После удаления будут возникать ошибки при обращении в коде к этому элементу.
А чем он вам мешает? В пользовательском режиме переместите его, чтобы в глаза не бросался. Например, в отдельную папку, где будут неактуальные элементы. А удалять нет смысла.
Большое спасибо!
Василий! Ещё маленький вопрос по предопределённым элементам. Как изменить вид отношений в карточке Партнёра на вкладке “Общая информация”(клетки “Клиент”, “Поставщик” и “Прочие отношения” не активны)? Почему-то у обычного Партнёра “галочки” в этих клетках ставить и удалять можно, а в случае предопределённого – нет!
Добрый день!
Это реализовано на уровне программного кода конфигурации. Например, в УТ 11 это действие выполняется в процедуре ПартнерФормаЭлементаУправлениеДоступностью общего модуля ПартнерыИКонтрагенты. Для предопределенного элемента эти галочки доступны только на чтение.
Так что если вам нужно изменить их, то можно программно при помощи обработки установить галочки так, как вам требуется.
Василий, большое спасибо за ответ! Я пользуюсь не УТ 11, а 1С:ERP УП 2 (2.2.1.142). Обработок сам не писал (для 1С), но программных вмешательств не боюсь, потому что когда-то (ещё в прошлом веке) писал на Турбо С 3.0 ++. С одной стороны, понимаю, что “сыроват” – язык 1С не изучал ещё. С другой стороны – “не боги горшки обжигают”: Фортран, Бэйсик, Pascal, PL, Кобол, Алгол, Турбо и Borland C, и даже машинно-ориентированный Ассемблер, – когда-то “пройдены на “Ура” в ВУЗе” …. Вижу, что улыбаетесь, но вряд ли десятую планету Солнечной системы открыли разработчики 1С – заглядывал я в модули: всё довольно интуитивно, в чём-то где-то похоже на какие-то языки из перечисленных выше и доступно для освоения, да ещё – и на русском языке!
Но, может быть можно “залезть” в нужный код и без создания обработок что-то там изменить. Если возможно, не подскажете имя Процедуры и где там “поковыряться”?
Скорее всего, процедуры для этих конфигураций будут одинаковые.
Так что если допускается вносить изменения в конфигурацию, в указанной процедуре можно закомментировать следующий фрагмент:
Форма.Элементы.Клиент.ТолькоПросмотр = Истина;
Форма.Элементы.Поставщик.ТолькоПросмотр = Истина;
Форма.Элементы.Конкурент.ТолькоПросмотр = Истина;
Форма.Элементы.ПрочиеОтношения.ТолькоПросмотр = Истина;
Форма.Элементы.ОбслуживаетсяТорговымиПредставителями.ТолькоПросмотр = Истина;
Форма.Элементы.Перевозчик.ТолькоПросмотр = Истина;
КонецЕсли;
скорей всего я что то не совсем понял. При обмене РИБ в ЦБ добавлен предопределенный реквизит и при старте системы к нему идет обращение. В УБ естественно происходит ошибка, т.к. конфу обновили. а вот данные нет. Как лучше всего обработать эту ситуацию?
Добрый день!
Теперь предопределенные данные переносятся как обычные данные (элементы справочников, документы и т.д.). В конфигурации нужно предусмотреть возможность выполнить обмен без обращения по имени к предопределенным элементам, которые приходят из центрального узла.
На сайте ИТС есть рекомендации – Пересмотр работы с предопределенными элементами в РИБ:
В “1С:Предприятии 8.3” в дочерних узлах РИБ предопределенные элементы автоматически не создаются (и не обновляются при изменении в метаданных), а должны быть переданы из главного узла вместе с изменениями конфигурации.
Для устранения несовместимости необходимо:
a) обеспечить загрузку сообщения обмена в подчиненный узел РИБ до выполнения другого прикладного кода, который обращается к получаемым из главного узла предопределенным элементам;
b) в прикладной логике загрузки данных из главного узла (обработчик события ПриПолученииДанныхОтГлавного, правила регистрации объектов) избегать обращений к предопределенным элементам, поскольку нет гарантии, что они уже были загружены из сообщения обмена;
c) код обработчиков обновления ИБ, который обрабатывает предопределенные элементы, не должен выполняться в подчиненных узлах РИБ.
при переходе с БП на БСО в конфигураторе появились несколько специфических предопределенных “строительных” счетов.
в базе данных есть соответствующие им элементы, но связать их никак не получается. При обращении обработками из режима предприятие счета не видны (ни обработкам, ни пользователю).
То есть, чтобы связать предопределенные элементы с данными их надо увидеть из пользовательского режима, а для этого они должны быть уже связаны… Как выйти из этого порочного круга?
Добрый день!
Вы пишете
в базе данных есть соответствующие им элементы
Т.е. в пользовательском режиме есть все-таки элементы и их нужно сделать предопределенными? Тогда вот этим элементам обработкой нужно заполнить свойство ИмяПредопределенныхДанных.
В пользовательском режиме есть сами предопределенные данные. И именно их “имя” нужно связать с предопределенным объектом конфигурации (счетом).
Эти данные я вообще нашел только вот этой обработкой http://infostart.ru/public/305892/, которая как раз и предназначена для связи предопределенных объектов с предопределенными данными. Но найдя несвязанные предопределенные данные она дает выбрать все объекты конфигурации, кроме нужных (потому что их не видно). Возможно, у плана счетов есть свои особенности…
По описанию обработка как раз делает то, что нужно. Может быть, какие-нибудь ограничения есть интерфейсные.
Смотрите, в конфигураторе мы добавили новый предопределенный элемент НовыйСчет. Какие варианты могут быть в пользовательском режиме?
1. В данных есть только один элемент, у которого ИмяПредопределенныхДанных равно НовыйСчет. Это правильная ситуация. Тут ничего править не нужно.
2. В данных нет элементов, у которого ИмяПредопределенныхДанных равно НовыйСчет. Тогда нужно обработкой “привязать” существующий или только что созданный специально для этого счет к предопределенным данным.
3. В данных есть несколько элементов, у которого ИмяПредопределенныхДанных равно НовыйСчет. Тогда нужно обработкой “отвязать” все счета, привязанные к предопределенным данным, кроме одного.
“Вступите в группу и скачайте статью в pdf”
О какой группе речь?
О нашей группе в Контакте – http://vk.com/kursypo1c
Пардон. У меня сначала кнопка была вообще без изображения. Теперь все в порядке. Извините за беспокойство.
А можно ли как-то получить наименование предопределенного элемента? Хочу программно создать предопределенный элемент, а как получить его наименование не знаю.
Добрый день!
Создать предопределенный элемент можно только в конфигураторе. А программно можно связать предопределенный элемент с каким-либо элементом в данных. Для этого используется свойство ИмяПредопределенныхДанных. Это свойство доступно для чтения (так можно получить имя предопределенного элемента) и для записи (так можно установить связь с предопределенным элементом).
Спасибо, хорошая статья.
По поводу: “Получение списка предопределенных элементов, заданных в метаданных, при помощи встроенного языка – невозможно.” – устаревшие данные.
С 8.3.5 появилась функция “ПолучитьИменаПредопределенных”.
Добрый день!
Спасибо за уточнение.
Действительно, начиная с платформы 8.3.5 для справочников, планов видов характеристик, планов счетов, планов видов расчетов доступен метод ПолучитьИменаПредопределенных(). Теперь можно получить список имен предопределенных элементов, заданных в конфигураторе. По этому списку можно проверить, что для всех предопределенных элементов есть элементы в данных.
ПолучитьИмяПредопределенного(). Или мой синтакс-помощник что-то путает?))
Верно ли утверждение:
С предприятия создать предопределенный элемент не получится?
Что хочу:
1. Создать элемент в предприятии.
2. Заполнить реквизит “ИмяПредопределенногоЭлемента”.
3. А при записи создался предопределенный элемент.
Что есть:
1. Создать предопределенный элемент в конфигураторе.
2. Найти СТАРЫЙ элемент в предприятии.
3. Заполнить в нём реквизит “ИмяПредопределенногоЭлемента”.
4. Удалить автоматически созданный элемент с п.1.
upd: Я понял :)
Нужно установить “обновление предопределенных данны” в “Не обновлять автоматически” и тогда элемент не будет создаваться.
Спасибо :)
Подскажите, пожалуйста, а какую практическую задачу вы решаете? В связи с чем возник вопрос – обмен данными в распределенной базе?
Получилось так что в конфигураторе нет возможности добавить предопределенный элемент (кнопка добавить не активна).
При попытке добавить предопределенный элемент с предприятия ошибка:
Предопределенный элемент не принадлежит “ИмяСправочника”.
Найдена cf где эти элементы есть в справочнике. Объединили конфу. При открытии критическая ошибка. Варианты: Закрыть или Завершить работу :(
upd. Текст ошибки:
Невосстановимая ошибка
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
Ошибка SDBL:
Тип поля OwnerID несовместим с типом литерала NUMERIC
upd2. Причина найдена.
Все оказалось просто. У справочника в 1С добавили владельца. А у справочников с владельцем предопределенных элементов не может быть :)
Спасибо за важное практическое дополнение!
Столкнулся с этой проблемой при обновлении. Статья очень помогла. Спасибо.
Пожалуйста. Отлично, что статья помогла вам на практике!
Можете немного подробнее расписать – какую конфигурацию обновляли, типовая или измененная, с какими предопределенными данными возникла проблема?
Ох, спасибо огромное за статью, выручаете меня в какой раз. Теперь стало понятно почему “задвоились” предопределенные счета в плане счетов и предопределенные элементы в справочниках в БП 3.0 на платформе 8.3. После переноса данных через универсальную обработку обмена УниверсальныйОбменДаннымиXML.epf для идентичных конфигураций с ИТС. Когда в первый раз увидел такую проблему, аж волосы на голове зашевелились.
Столкнулся с задвоением плана счетов после выгрузки-загрузки XML. Подскажите подробно что делали для исправления этого? Заранее спасибо
Добрый день!
Спасибо большое за подробную статью!
Читая, старался соотнести получаемую информацию со “своим текущим моментом”. А в “мой текущий момент” ситуация такова, что я целиком и полностью занят на работе с “Комплексной автоматизацией” – 1.1, что привязывает меня к работе в режиме обычного приложения.
ВОПРОС: Отличается ли как-то использование предопределенных элементов, описанных в данной статье, от работы в режиме обычного приложения, под управлением платформы 8.3.4, но в режиме “Совместимости с 8.2.13”?
P.S. Насколько понимаю, в данном случае статья для меня имеет чисто академический интерес.
При работе на платформе 8.3 в режиме совместимости “Версия 8.2.13” предопределенные элементы работают в “классическом” варианте. Стандартный реквизит ИмяПредопределенныхДанных и описанные в статье особенности становятся доступными при переключении режима совместимости в значение “Версия 8.3.3”.
Ясно. Спасибо большое за ответ.
Собственно, это я и подозревал. :)
Эх, когда же выйдет “комплексная” – 2.0?..
Спасибо за статью – очень познавательно и интересно!
Только меня мучает один вопрос – для чего это всё? Предопределённые ведь для того и создавались, чтобы иметь какие-то твёрдые ориентиры в этой жизни, а тут получается – я создавал-создавал элементы, писал-писал код, а кто-то зашёл даже не в конфигуратор, а так, всё грохнул и весь труд коту под хвост и полная конфигурация ошибок.
Я понимаю, что этот вопрос не к авторам статьи, это вопрос в 1С, но, возможно, кто-то более понятливый, чем я, уловил суть этого новшества?
Классический механизм предопределенных данных создавал ограничения при развитии платформы для “облачных технологий” (режим разделенной информационной базы). Невозможно было использовать предопределенные данные для объектов конфигурации, входящих в состав разделителя в режиме “Независимо и совместно”. У предопределенного элемента ссылка была одинакова во всех областях данных. Да и при использовании распределенной базы предопределенные элементы переносились только с изменениями конфигурации, что тоже могло доставлять неудобства. Поскольку облачные технологии – достаточно важное направление для 1С, то мы получили такие изменения в платформе 8.3.
Мое мнение, что РИБ это уже устаревая технология. “Облачные технологии”, web-клиент и прочее, как раз и были созданы для того, чтобы уйти от РИБ и всяких майкрософт-терминалов, к онлайн работе в одной ИБ в любой точке мира через интернет. Первые типовые конфигурации на УФ (ранние версии УТ 11), даже не содержали “Полного” ПланаОбмена, приходилось снимать с “замка” и вручную создавать его для настройки РИБ. Поэтому мне тоже до конца не понятны эти “танцы с бубном” = с предопределенными элементами. Разве, что создать видимость своей работы, и головной боли для внедренцев. К примеру, задвоение предопределенных счетов в рабочей базе БП 3.0, приводит к очень серьезным и плачевным последствиям…
Отличная статья!
Возможность переопределения пердопределённых значений в пользовательском режиме – это интересная возможность!
О статье: полезно и очень подробно (и для 8.3.3 и для 8.3.4 в полном объёме), толковая статья!
Спасибо, Александр!
Благодарю, интересно!
Добрый день. Статья содержит много полезной информации.
Только в тексте запроса ГДЕ (ИмяОбъекта.Предопределенный = ИСТИНА);,
лучше писать ГДЕ (ИмяОбъекта.Предопределенный);
Добрый день!
Спасибо, внесли корректировку :)
Спасибо. Статья понравилась. У меня есть небольшое замечание: мне кажется, в начале статьи нужно обратить внимание на то, что есть список предопределенных элементов, заданных в конфигураторе и есть список предопределенных элементов, присутствующий в данных. По ходу статьи, конечно, это становится понятным. Но лучше сразу это обозначить.
Ок, спасибо Наталья, учтем.
Здравствуйте!!! Рискну прокомментировать..) Не так часто сталкиваюсь с РИБ и читая статью все время пыталась привязать к практике. Получалось плохо. Дочитала до конца и узнав что это важно в РИБ – начала читать сначала. Читать было уже легче. Возможно было бы неплохо конец вынести в начало?? Но, думаю, асам большим чем я, это не нужно. С уважением.
Добрый день, Светлана!
Спасибо, учтем Ваше пожелание.
Статья понравилась. Для меня это новый материал. Спасибо.
Очень интересная статья
Очень понравилось – подробно, с примерами, понятно.
Спасибо!
Спасибо, Ирина!
достаточно подробно всё расписано, спасибо
Ок :)
Очень познавательно, Спасибо. В некоторых примерах кода(например после слов “При помощи запроса обратимся к полю ИмяПредопределенныхДанных.”) он обрезается и его не видно, возможно дело в Опере.
Спасибо, Антон.
Работаем над этим, в ближайшее время поправим!