Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
26 мая 2024, 00:56

Знатоки! Помогите с ТЧ в справочнике

Автор Алексей_1985_06, 28 дек 2019, 14:37

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

Алексей_1985_06

Доброго времени! Сразу по существу, конфигурация самописная 8.3 УФ
Необходимо сделать так, что бы при проведении документа "Присвоение званий", не было дублирования записей в ТЧ "Воинские звания" справочника "Личный состав" (т.е если такое звание уже записано в ТЧ справочника, то при проведении документа с таким же званием, показывалось соответствующие сообщение)

Реализовано следующие:
ПОЛУЧАЕМ ЗНАЧЕНИЕ ИЗ ТЧ ЛЮБОЙ КОЛОНКИ
&НаСерверебезКонтекста
Функция ПолучитьСтрокуТЧнаСервере(СсылкаНаЭлемент, ИмяТабличнойЧасти, ИмяКолонки, НомерСтроки = 0)//СсылкаНаЭлемент ссылка на созданный элемент справочника ЛичныйСостав (например: Иванов Иван Иванович) тот кого вы выбрали в документе
   ТабличнаяЧасть = СсылкаНаЭлемент[ИмяТабличнойЧасти]; //указатель на таб.часть = ЛичныйСостав.ВоинскиеЗвания
   КоличествоСтрок = ТабличнаяЧасть.Количество();//количество строк в ТЧ "ВоинскиеЗвания"
   Если КоличествоСтрок = 0 Тогда //ТЧ пустая, воинских званий еще нет
   Значение = Неопределено;
   Иначе
   Строка = Мин(НомерСтроки, КоличествоСтрок - 1); //определяем последнюю или указанную строку в таблице Воинские звания
   Значение = ТабличнаяЧасть[Строка][ИмяКолонки]; //получаем значение: из указанной строки берем значение нужной колонки
   КонецЕсли;
   Возврат Значение; //возвращаем результат
КонецФункции


&НаСервере
Процедура ИзменитьДанныеСправочникаНаСервере()
ИзмСправочник = Объект.ФамилияИмяОтчество.ПолучитьОбъект(); // Получаем объект
// Проверяем какое последние звание записано в ТЧ Спарвочника
ЗаписаноеЗвание = ПолучитьСтрокуТЧнаСервере(Объект.ФамилияИмяОтчество, "ВоинскиеЗвания", "ВоинскоеЗвание", 100);

Если Объект.ВоинскоеЗвание = ЗаписаноеЗвание Тогда
Сообщить("Такое звание уже было записано ранее")

Иначе
НоваяСтрока =  ИзмСправочник.ВоинскиеЗвания.Добавить();  // Добавляем новую строку в ТЧ "ВоинскиеЗвания"
НоваяСтрока.ВоинскоеЗвание = Объект.ВоинскоеЗвание;
НоваяСтрока.ДатаПриказа = Объект.ДатаПриказа;
НоваяСтрока.НомерПриказа = Объект.НомерПриказа;
НоваяСтрока.ЧейПриказ = Объект.ЧейПриказ;
НоваяСтрока.Коррекция = ИмяПользователя() + " | " + Строка(Формат(ТекущаяДата(),"ДЛФ=ДДВ"));
ИзмСправочник.Записать(); // записываем изменения в информационную базу
КонецЕсли;
КонецПроцедуры


:dfbsdfbsdf::dfbsdfbsdf::dfbsdfbsdf:
ВЫПАДАЕТ ОШИБКА:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ПрисвоениеВоинскихЗваний.МодульОбъекта(8)}: Поле объекта не обнаружено (ВоинскиеЗвания)
   Движения.ВоинскиеЗвания.Записывать = Истина;


Что не так? Подскажите!!!:befhbt::befhbt::befhbt:


Алексей_1985_06

Цитата: Алексей_1985_06 от 28 дек 2019, 14:37
Доброго времени! Сразу по существу, конфигурация самописная 8.3 УФ
Необходимо сделать так, что бы при проведении документа "Присвоение званий", не было дублирования записей в ТЧ "Воинские звания" справочника "Личный состав" (т.е если такое звание уже записано в ТЧ справочника, то при проведении документа с таким же званием, показывалось соответствующие сообщение)

Реализовано следующие:
ПОЛУЧАЕМ ЗНАЧЕНИЕ ИЗ ТЧ ЛЮБОЙ КОЛОНКИ
&НаСерверебезКонтекста
Функция ПолучитьСтрокуТЧнаСервере(СсылкаНаЭлемент, ИмяТабличнойЧасти, ИмяКолонки, НомерСтроки = 0)//СсылкаНаЭлемент ссылка на созданный элемент справочника ЛичныйСостав (например: Иванов Иван Иванович) тот кого вы выбрали в документе
   ТабличнаяЧасть = СсылкаНаЭлемент[ИмяТабличнойЧасти]; //указатель на таб.часть = ЛичныйСостав.ВоинскиеЗвания
   КоличествоСтрок = ТабличнаяЧасть.Количество();//количество строк в ТЧ "ВоинскиеЗвания"
   Если КоличествоСтрок = 0 Тогда //ТЧ пустая, воинских званий еще нет
   Значение = Неопределено;
   Иначе
   Строка = Мин(НомерСтроки, КоличествоСтрок - 1); //определяем последнюю или указанную строку в таблице Воинские звания
   Значение = ТабличнаяЧасть[Строка][ИмяКолонки]; //получаем значение: из указанной строки берем значение нужной колонки
   КонецЕсли;
   Возврат Значение; //возвращаем результат
КонецФункции


&НаСервере
Процедура ИзменитьДанныеСправочникаНаСервере()
ИзмСправочник = Объект.ФамилияИмяОтчество.ПолучитьОбъект(); // Получаем объект
// Проверяем какое последние звание записано в ТЧ Спарвочника
ЗаписаноеЗвание = ПолучитьСтрокуТЧнаСервере(Объект.ФамилияИмяОтчество, "ВоинскиеЗвания", "ВоинскоеЗвание", 100);

Если Объект.ВоинскоеЗвание = ЗаписаноеЗвание Тогда
Сообщить("Такое звание уже было записано ранее")

Иначе
НоваяСтрока =  ИзмСправочник.ВоинскиеЗвания.Добавить();  // Добавляем новую строку в ТЧ "ВоинскиеЗвания"
НоваяСтрока.ВоинскоеЗвание = Объект.ВоинскоеЗвание;
НоваяСтрока.ДатаПриказа = Объект.ДатаПриказа;
НоваяСтрока.НомерПриказа = Объект.НомерПриказа;
НоваяСтрока.ЧейПриказ = Объект.ЧейПриказ;
НоваяСтрока.Коррекция = ИмяПользователя() + " | " + Строка(Формат(ТекущаяДата(),"ДЛФ=ДДВ"));
ИзмСправочник.Записать(); // записываем изменения в информационную базу
КонецЕсли;
КонецПроцедуры


:dfbsdfbsdf::dfbsdfbsdf::dfbsdfbsdf:
ВЫПАДАЕТ ОШИБКА:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ПрисвоениеВоинскихЗваний.МодульОбъекта(8)}: Поле объекта не обнаружено (ВоинскиеЗвания)
   Движения.ВоинскиеЗвания.Записывать = Истина;


Что не так? Подскажите!!!:befhbt::befhbt::befhbt:

Ребят эта проблема решена, все РАБОТАЕТ:
ПОДСКАЖИТЕ КАКУЮ ПРОЦЕДУРУ НУЖНО ВЫБРАТЬ, ЧТОБ СООБЩЕНИЕ О ДУБЛИРОВАНИИ ЗАПИСИ "ВЫСВЕЧИВАЛОСЬ" ПРИ НАЖАТИИ НА КНОПКУ "ПРОВЕСТИ И ЗАКРЫТЬ", СЕЙЧАС У МЕНЯ ТАКОЕ ПОЛУЧАЕТСЯ ТОЛЬКО ПРИ НАЖАТИИ НА КНОПКУ "ЗАПИСАТЬ"

&НаСерверебезКонтекста
Функция ПолучитьСтрокуТЧнаСервере(СсылкаНаЭлемент, ИмяТабличнойЧасти, ИмяКолонки, НомерСтроки = 0)//СсылкаНаЭлемент ссылка на созданный элемент справочника ЛичныйСостав
   ТабличнаяЧасть = СсылкаНаЭлемент[ИмяТабличнойЧасти];
   КоличествоСтрок = ТабличнаяЧасть.Количество();
   Если КоличествоСтрок = 0 Тогда
   Значение = Неопределено;
   Иначе
   Строка = Мин(НомерСтроки, КоличествоСтрок - 1);
   Значение = ТабличнаяЧасть[Строка][ИмяКолонки];
   КонецЕсли;
   Возврат Значение;
КонецФункции


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


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ИзменитьДанныеСправочникаНаСервере();
КонецПроцедуры



Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск