Что такое ключ связи в 1с
1С 8.1. УТ. В табличной части документа Заказ покупателя, есть реквизит Ключ строки. Для чего он, и как его пользовать? Спасибо.
(0) возможно, для связи с другими табличными частями
(0) Для связи с ТЧ СоставНабора. Если используешь комплекты — пригодится 🙂
(0) +(1) и вроде бы для группировки товаров-наборов
Вне зависимости от перемещения строки по таблице ее Ключ не меняется, что позволяет четко определить связь с другими таблицами (подчиненными, например)
Значит при программном вводе Реализации ТиУ на основании Заказ покупателя, ключ строки роли не играет. Так получается?
Связанные табличные части (управляемые формы)
У нас есть 2 связанные табличные части, и нам надо, чтобы по текущей строке в одной из них мы видели только определенные строки во второй. Были бы у нас динамические списки, мы бы взяли событие «При активизации строки» и стандартный механизм отборов СКД, которая лежит в основе списка. Но вот с табличными частями так не получится. Тут нам надо будет написать несколько строк кода и использовать «ОтборСтрок», доступный для таблицы формы. Тестировалось на платформе 8.3.13.1644, будет работать и на более ранних версиях платформы.
Скачать файлы
Про «ОтборСтрок» я уже писал в недалеком прошлом поэтому не буду повторяться. Что это и для чего это используется можно изучить в статье Отборы (поиск) в табличной части либо таблице значений (управляемые формы)
Для демонстрации механизма я снова подготовил небольшую конфигурацию, которую можно скачать.

Конфигурация состоит из двух справочников: «Контрагенты» и «Товары» и одного документа «Поступление товаров». Данный документ имеет 2 соответствующие табличные части и предназначен для получения товаров от разных клиентов в одном документе.
Визуально форма выглядит так:

Мы хотим сделать так, чтобы клиенту было удобно и он выбирая клиента видел только те товары, которые приходят от него.
В качестве ключа связи мы будем использовать само значение контрагента. При этом можно в качестве ключа связи использовать произвольные ключи, уникальные в пределах документа или любые ссылочные элементы, например договора контрагентов — все зависит только от вашей необходимости.
Для нашей левой табличной части «Контрагенты» нам надо добавить следующие обработчики событий:

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

Мы должны отклонить выбор номенклатуры если у нас нет или не выбран контрагент и автоматически заполнять значение ключа связи — в нашем случае это ссылка на контрагента. Сами процедуры:
&НаКлиенте Процедура ТоварыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Если Элементы.Контрагенты.ТекущиеДанные = Неопределено Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Если НоваяСтрока И НЕ Копирование Тогда Элемент.ТекущиеДанные[НаименованиеКлючаСвязи] = Элементы.Контрагенты.ТекущиеДанные[НаименованиеКлючаСвязи]; КонецЕсли; КонецПроцедуры
Ну и в основном для вопросов отладки нам надо посмотреть все товары всех клиентов, для этого добавляем команду по очистке отборов и размещаем ее в интерфейсе с ограничением по правам (если требуется). Процедура простейшая:
&НаКлиенте Процедура ОчиститьОтбор(Команда) СнятьОтборСЭлементов(Элементы.Товары); КонецПроцедуры
Для того, чтобы учесть возможность смены самого контрагента, мы добавили в форме реквизит табличной части :

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

Механизм реализации такой абсолютно такой же.
Главная и подчиненная таблицы в 1С — связывание
Наверняка многие сталкивались с вопросом о связывании двух- и более таблиц на формах 1С по принципу главная-подчиненная. Один из возможных вариантов решения я приведу в этой статье. Некоторые решения я уже встречал, но они либо ограничивают возможности таблиц (невозможность сортировки, изменения номера строки и перестановки строк местами) либо требовали дополнительного кода по обработке различных изменений в связанной информации. Предлагаю более разумное и довольно простое решение.
Наверняка многие сталкивались с вопросом о связывании двух- и более таблиц на формах 1С по принципу главная-подчиненная. Один из возможных вариантов решения я приведу в этой статье. Некоторые решения я уже встречал, но они либо ограничивают возможности таблиц (невозможность сортировки, изменения номера строки и перестановки строк местами) либо требовали дополнительного кода по обработке различных изменений в связанной информации. Предлагаю более разумное и довольно простое решение. Идея: 1. Необходима уникальная скрытая связка в двух таблицах, обеспечивающая простую в обработке синхронизацию полей главной и подчиненной таблиц. Реализация: В поисках такой универсальной связки наткнулся на конструкцию вида:
Новый УникальныйИдентификатор;
Как раз его и будем использовать для связывания. В обе табличные части документа добавляем поле с типом УникальныйИдентификатор. После этого необходимо в модуле формы обработать несколько событий, а именно: ПриНачалеРедактирования — Табличного поля главной таблицы и Табличного поля подчиненной таблицы. ПередУдалением — Табличного поля главной таблицы для очистки связанных строк подчиненной. ПриАктивизацииСтроки — для отбора строк подчиненной таблицы. Вот и все. А теперь примеры обработчиков, кстати, они универсальны для любых решений.
Процедура ГлавнаяТаблицаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Данные = ЭлементыФормы.ГлавнаяТаблица.ТекущаяСтрока; Если НоваяСтрока Тогда Данные.ИД = Новый УникальныйИдентификатор; КонецЕсли; КонецПроцедуры Процедура ПодчиненнаяТаблицаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Данные = ЭлементыФормы.ГлавнаяТаблица.ТекущаяСтрока; ТекДанные = ЭлементыФормы.ПодчиненнаяТаблица.ТекущаяСтрока; Если НоваяСтрока Тогда ТекДанные.ИД = Данные.ИД; КонецЕсли; КонецПроцедуры Процедура ГлавнаяТаблицаПередУдалением(Элемент, Отказ) Данные = ЭлементыФормы.ГлавнаяТаблица.ТекущаяСтрока; Отбор = Новый Структура("ИД",Данные.ИД); Масс = ПодчиненнаяТаблица.НайтиСтроки(Отбор); Для каждого Строка из Масс Цикл ПодчиненнаяТаблица.Удалить(Строка); КонецЦикла; КонецПроцедуры Процедура ГлавнаяТаблицаПриАктивизацииСтроки(Элемент) Данные = ЭлементыФормы.ГлавнаяТаблица.ТекущаяСтрока; Если Данные = Неопределено Тогда Возврат; КонецЕсли; ЭлементыФормы.ПодчиненнаяТаблица.ОтборСтрок.ИД.Значение = Данные.ИД; ЭлементыФормы.ПодчиненнаяТаблица.ОтборСтрок.ИД.Использование = истина; КонецПроцедуры
И совсем небольшое дополнение — полю ИД устанавливаем Свойство:Индексировать = индексировать. Поле Табличного Поля можно (и нужно во избежание) сделать недоступным для пользователя. Жду ваших отзывов и критики :).
Ошибка : Сообщение при запуске «Нет прав для работы с модулем ТСД»
Ошибка связана с тем, что ключ, который был найден не соответствует режиму запуска, либо не был зарегистрирован.
Во-первых, необходимо убедится, что все ключи были зарегистрированы в фирме AXELOT.
Второе, надо быть уверенным, что подключение происходит к нужному ключу. Для этого есть 2 метода.
Первый метод — расположить ключи на разных серверах по их типу, в сервер1 вставить все ключи основного модуля, в сервер2 — все ключи модуля ТСД.
При запуске в компоненте защиты необходимо прописать соответствующий сервер.
Главный недостаток этого метода: необходимо 2 сервера. Есть еще одна задача: если и обычные пользователи, и пользователи ТСД работают на одном и том же терминальном сервере, то необходимо произвести дополнительную настройку. Надо указать, что для каждого сеанса используются свои настройки компоненты защиты.
Делается это следующим образом: в окне инициализации СЛК 1.1 необходимо нажать кнопку «Настроить параметры…», в открывшемся окне развернуть все настройки, для этого нажать кнопочку «Дополнительные параметры >>» и снять галочку «Общие настройки связи для всех пользователей Windows».
Также форму параметров связи можно вызвать и из уже запущенного сеанса 1С Логистики: меню «Сервис» -> «Параметры…» -> закладка «Лицензирование и Защита» -> «Настроить параметры связи…». ВАЖНО: галочка «Общие настройки связи для всех пользователей Windows» присутствует только в СЛК 1.1, версия файла LicenceAddIn.dll не ниже чем 1.1.2.58, версию этого файла можно посмотреть в каталоге %Program Files%\1C\Licence 1.1\bin\.

Второй метод предполагает установить все ключи в один сервер, в таком случае надо будет каждому пользователю указать конкретный номер ключа, с которым он работает.
Главный недостаток этого метода: в компании 25 человек, которые работают с УС, а ключей всего на 20, но эти 25 пользователей работают не все одновременно, а только некоторая их часть не более 20.
В первом методе такая работа возможна, во втором нет.
Сделать такие настройки можно следующим образом.
Для этого надо открыть форму параметров связи (см. выше) и установить галочку «Использовать для работы ключ с определенным С/Н», после этого установить в поле «С/Н ключа» нужный номер ключа.
Этим методом – перебирая по очереди С/Н ключей можно определить тот ключ, который забыли зарегистрировать.
Далее описан способ изменения неверных настроек.
Метод, который работает всегда – отключить сервер СЛК или вынуть все ключи, в таком случае при инициализации СЛК возникнет ошибка связи с сервером, и можно будет воспользоваться кнопкой «Настроить параметры связи…». Таким способом можно последовательно подключить все ключи.
Другой способ: Прописать параметры в файле настроек.
Параметры связи хранятся в файле LicenceAddIn.config, который находится по адресу C:\Users\Пользователь\AppData\Roaming\1C\Licence 2.0. ВАЖНО: Файл будет существовать только в том случае, если какие-либо настройки связи с ключом были изменены.
Секция [Common] описывает общие параметры СЛК: ShowErrors – признак отображать ли ошибки СЛК при запуске (0 – нет, 1 – да), ShowWarnings – признак отоборажать ли предупреждения от СЛК при запуске (ПОЛЕЗНО: если установить 0, то при запуске не будут отображаться сообщения о том что версия datafile или paramfile устарела), SettingsPerUser – использовать ли разные настройки для каждого пользователя Windows.
После этого идет общая секция серии ключей [3DFF] – в скобках указана серия ключей, для которой будут действовать эти настройки. Host – имя сервера, на котором следует искать ключ, Port – порт по которому работает сервер СЛК, ConnectTimeout – время (сек.), в течении которого ожидать установки связи с сервером СЛК, RequestTimeout – время (сек.), в течении которого ожидать ответа от сервера СЛК при проверке связи, KeepAlivePeriod – период (сек.), через который опрашивать сервер о наличие связи, UseKeyNo – признак использовать ли определенный ключ при работе (1), или произвольный (0), KeyNo – в случае если используется определенный ключ, то здесь указывает его номер. Эта секция может повторяться для других серий ключей, если таковые есть.
Секция [3DFF.dshorin] содержит те же самые настройки, что [3DFF], с тем лишь отличием, что это настройки для конкретного пользователя Windows, в данном случае для пользователя dshorin. Соответственно данная секция будет существовать только если настройка SettingsPerUser равна 1. Тогда такая секция будет существовать для каждого пользователя Windows, для которого настраивались параметры связи. Здесь можно быстро настроить параметры по всем пользователям (копированием секции), тогда не понадобится заходить под каждым пользователем и прописывать его настройки. Секция может повторяться для каждого из пользователей с данными по другой серии ключей.
Если статья была полезной для Вас — любая сумма поможет частному приюту » Сохрани мою жизнь, Человек! Кошки, собаки «
https://t.me/saveandprotectwithlove
КАТАЛОГ ПРОГРАММ 1С
- Бухгалтерский и налоговый учет
- Зарплата и управление персоналом
- Торговый и складской учет
- Обработки и отчеты для 1С

Если сайт был полезен — любая сумма поможет частному приюту » Сохрани мою жизнь, Человек! Кошки, собаки » :
https://t.me/saveandprotectwithlove
Спасибо!





