Книга знаний

1С:Предприятие / Приемы программирования / Формы

Ограничена длина текстового поля

В форме обработки есть таблица, которая редактируется в обработке. Одно поле таблицы имеет
фиксированную длину. Где это задано, найти не могу.
Serg57
Последняя редакция №0 от 13.06.13
URL: http://kb.mista.ru/article.php?id=917

Обработка досталась по наследству. Прекрасно работает. Понадобилось изменить длину вводимого поля не
могу найти где это. Текст прилагаю. проблемный реквизит - рЗаказ.
// переменные для работы с формой
Перем РасширениеФормы, АтрибутФормы;
// переменная для флага разрешения закрытия формы
Перем МожноЗакрыть;
// переменные для хранения идентификатора текущей редактируемой колонки и номера редактируемой
строки
Перем РедактируемаяКолонка, РедактируемаяСтрока;  

Перем Распределение, Спр_МестаХранения, СписокСкладов, ЗакпытьБезИзменений, БылиМзменения,
СписокКомментариев, Количество, СтарРаспрелеление;

Процедура ПриРедактированииТЗ(тс = 0)
   // вызов этой процедуры прописан в поле Формула ТЗ
   //
   Если тс = 0 Тогда
       тс = ТЗВвода.ТекущаяСтрока();
   КонецЕсли;
   Если тс = 0 Тогда
       // если текущей строки нет, то ничего не делаем
       //Возврат;  
       тс = 1;
       ТЗВвода.НоваяСтрока();
       ТЗВвода.рСистемная="BRUSH["+ПолучитьЦвет(230,230,230)+"] FONTSET["+ГлШрифт+"] ";
       //ТЗВвода.рСклад = ;
       ТЗВвода.рКво = 1;
   КонецЕсли;
   // получаем идентификатор текущей колонки
   _тк = ТЗВвода.ТекущаяКолонка();
   // получаем номер текущей колонки
   тк = ТЗВвода.ПолучитьПараметрыКолонки(_тк);
   // проверяем есть ли для этой колонки служебный реквизит
   Попытка
       Атр = РасширениеФормы.ПолучитьАтрибут(_тк);
   Исключение
       // нет служебного реквизита с таким идентификатором
       Возврат;
   КонецПопытки;

   в = ""; л = ""; н = ""; п = "";
   // получаем экранные координаты текущей ячейки таблицы
   РасширениеФормы.ПолучитьКоординатыТекущейЯчейки("ТЗВвода",в,л,н,п);
   // перемещаем служебный реквизит так, чтобы он вписался внутрь ячейки
   Атр.УстановитьКоординаты(л,в,п-л,н-в);
   // изменяем стиль слежубного реквизита, чтобы он более походил на используемые при вводе в
многострочных частях
   Атр.Рамка = 0;
   // изменяем родительское окно служебного реквизита
   // если этого не сделать, то ТЗ просто перекроет наш реквизит и мы ничего с ним не сможем
сделать интерактивно
   Атр.РодительскоеОкно = Форма.ТЗВвода;
   // устанавливаем текущее значение из ТЗ в служебный реквизит
   Атр.Значение = ТЗВвода.ПолучитьЗначение(тс,тк);
   // показываем служебный реквизит...
   Форма.ПолучитьАтрибут(_тк).Видимость(1);
   // ... и активизируем его
   Активизировать(_тк,1);
   // запоминаем текущую колонку
   РедактируемаяКолонка = _тк;
   // и текущую строку
   РедактируемаяСтрока = тс;  
   Если Атр.Идентификатор = "рКомментарий" Тогда  
       Если ПустоеЗначение(Атр.Значение) = 1 Тогда
           Сервис=СоздатьОбъект("Сервис");
           ВыбКомм = " ";
           Сервис.ВыбратьЗначение(СписокКомментариев,ВыбКомм,"",0);  
           Если ПустаяСтрока(ВыбКомм) = 0 Тогда
               Атр.Значение = ВыбКомм;
               
ТЗВвода.УстановитьЗначение(РедактируемаяСтрока,"рКомментарий",ВыбКомм);
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры    // ПриРедактированииТЗ

Процедура ПриОкончанииРедактирования(обновлять = 1)
   // процедура вызывается при окончании редактирования ТЗ
   // параметр "обновлять" показывает - надо ли переносить новое значение из служебного
реквизита в ТЗ или нет (отмена редактирования)
   
   // проверяем было ли начало редактирования ТЗ
   Попытка
       Атр = РасширениеФормы.ПолучитьАтрибут(РедактируемаяКолонка);
   Исключение
       // хм... не было... ничего не делаем
       Возврат;
   КонецПопытки;
   // возвращаем служебному реквизиту форму в качестве родительского окна
   Атр.РодительскоеОкно = "";
   
   Если РедактируемаяКолонка="" Тогда
       Возврат;
   КонецЕсли;
   
   // скрываем служебный реквизит
   Форма.ПолучитьАтрибут(РедактируемаяКолонка).Видимость(0);    
   // проверяем надо ли обновлять значение в ТЗ
   Если обновлять = 1 Тогда
       Если РедактируемаяКолонка = "рСкладСтрокой" Тогда  
           Если ПустоеЗначение(глСкладДляПеремещения) = 1 Тогда
               Спр_МестаХранения.ВыбратьЭлементы();
               Пока Спр_МестаХранения.ПолучитьЭлемент() = 1 Цикл
                   Если (Спр_МестаХранения.ПометкаУдаления() = 1) ИЛИ
(Спр_МестаХранения.ЭтоГруппа() = 1)  Тогда
                       Продолжить;
                   КонецЕсли;  
                   Если Найти(Врег(Спр_МестаХранения.Наименование),
Врег(СокрЛП(Атр.Значение))) = 0 Тогда
                       Продолжить;
                   КонецЕсли;
                   //------------------------------
                   // Обход склада спутника
                   Если ПустоеЗначение(Спр_МестаХранения.ГлСклад) = 0 Тогда
                       Продолжить;
                   КонецЕсли;
                   //Конец обхода
                   
СписокСкладов.ДобавитьЗначение(Спр_МестаХранения.ТекущийЭлемент(), Спр_МестаХранения.Наименование);  
               КонецЦикла;  
               Сервис=СоздатьОбъект("Сервис");
               ВыбСклад = "";
               номСклад = "";
               Сервис.ВыбратьЗначение(СписокСкладов,ВыбСклад,"Склад",0);
               //СписокСкладов.ВыбратьЗначение(ВыбСклад,"склад",номСклад,10,2);
               Если ПустоеЗначение(ВыбСклад) = 0 Тогда
                   
ТЗВвода.УстановитьЗначение(РедактируемаяСтрока,"рСклад",ВыбСклад);  
                   
ТЗВвода.УстановитьЗначение(РедактируемаяСтрока,"рСкладСтрокой",ВыбСклад.Наименование);
               КонецЕсли;  
               СписокСкладов.УдалитьВсе();
           Иначе
               
ТЗВвода.УстановитьЗначение(РедактируемаяСтрока,"рСклад",глСкладДляПеремещения);  
               
ТЗВвода.УстановитьЗначение(РедактируемаяСтрока,"рСкладСтрокой",глСкладДляПеремещения.Наименование);
           КонецЕсли;
           //ИначеЕсли РедактируемаяКолонка = "рКомментарий" Тогда
       //ИначеЕсли РедактируемаяКолонка = "рЗаказ" Тогда
       //    Если (ПустаяСтрока(Атр.Значение) = 1) ИЛИ (СтрДлина(СокрЛП(Атр.Значение)) >=
5) Тогда
       //        
ТЗВвода.УстановитьЗначение(РедактируемаяСтрока,РедактируемаяКолонка,Атр.Значение);  
       //    Иначе
       //        Предупреждение("Номер заказа должен иметь 6 знаков!",5);
       //        Возврат;
       //    КонецЕсли;
       Иначе
           // если надо, то переносим значение из служебного реквизита в ТЗ
           
ТЗВвода.УстановитьЗначение(РедактируемаяСтрока,РедактируемаяКолонка,Атр.Значение);
       КонецЕсли;
       // обновляем форму  
       БылиМзменения = 1;
       Форма.Обновить(1);
   КонецЕсли;
   // делаем "хитрое" закрытие формы, чтобы активизировать ТЗ
   МожноЗакрыть = 0;
   Форма.Закрыть(0);
   // обнуляем переменные с текущей колонкой и строкой
   РедактируемаяКолонка = "";
   РедактируемаяСтрока = "";
КонецПроцедуры    // ПриОкончанииРедактирования

Процедура ПриНажатииКнопкиКлавиатуры(КК,А,Ш,К,С,ФСО)
   // предопределенная процедура при нажатии кнопки клавиатуры
   // здесь нам необходимо отследить потерю фокуса сбужебным реквизитом
   
   // получаем активный атрибут формы
   акт = Форма.АктивныйЭлемент();
   Если (акт = РедактируемаяКолонка) и (РедактируемаяКолонка <> "") Тогда
       // если активным является атрибут с идентификатором равным редактируемой колонки,
       // то проверим что, собственно, нажато и не потеряет ли реквизит фокус
       Если С = СимволТабуляции Тогда
           // нажата табуляция
           // воспринимаем это как нормальное завершение редактирования с обновление
значения в ТЗ
           ПриОкончанииРедактирования();
       ИначеЕсли С = Симв(27) Тогда
           // нажат Esc
           // обрабатываем это как отмену ввода в ТЗ
           ПриОкончанииРедактирования(0);
           // дальнейшую обработку отменяем
           ФСО = 0;
       КонецЕсли;
   ИначеЕсли акт = "ТЗВвода" Тогда
       Если КК = 45 Тогда
           // здесь можно дописать добавление строк по Ins
           ТЗВвода.НоваяСтрока();  
           ТЗВвода.рСистемная="BRUSH["+ПолучитьЦвет(230,230,230)+"] FONTSET["+ГлШрифт
+"] ";
           //ТЗВвода.рНедоступная = Формат(ТЗВвода.КоличествоСтрок(),"ЧП");
           ТЗВвода.ТекущаяСтрока(ТЗВвода.КоличествоСтрок());
           //С эмулируем нажатие клавиши "end"
           Сервис.SendKeys("{END}");
       ИначеЕсли КК = 46 Тогда
           // здесь можно дописать удаление строк по Del  
           Попытка
               ТЗВвода.УдалитьСтроку(ТЗВвода.ТекущаяСтрока());
           Исключение
           КонецПопытки;
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры

Процедура ПриНажатииЛевойКнопки(сост,х,у,фсо)
   // предопределенная процедура при нажатии левой кнопки мыши
   // здесь надо проверить не произведен ли клик вне служебного реквизита при редактировании
   
   // получаем активный атрибут формы  
   акт = Форма.АктивныйЭлемент();
   Если (РедактируемаяКолонка = "рСкладСтрокой") И (СписокСкладов.РазмерСписка() > 0) Тогда
       Возврат;  
   //ИначеЕсли  РедактируемаяКолонка = "рЗаказ" Тогда
   //    // устанавливаем атрибут
   //    //АтрибутФормы.УстановитьАтрибут(Форма,акт);
   //    //ПриОкончанииРедактирования();
   //    Возврат;
   ИначеЕсли (акт = РедактируемаяКолонка) и (РедактируемаяКолонка <> "") Тогда
       // если активным является атрибут с идентификатором равным редактируемой колонки,
       // то проверим где произошло нажатие
       в = ""; л = ""; ши = ""; вы = "";
       // устанавливаем атрибут
       АтрибутФормы.УстановитьАтрибут(Форма,акт);
       // получаем его координаты
       АтрибутФормы.ПолучитьКоординаты(л,в,ши,вы);
       // проверяем попал ли клик мыши внутрь нашего служебного реквизита
       Если ((х - л) >= 0) и ((х - л) <= ши) и
            ((у - в) >= 0) и ((у - в) <= вы) Тогда
           // попал, продолжаем редактирование
           Возврат;
       КонецЕсли;
       // не попал, реквизит потерял фокус, отменяем редактирование
       ПриОкончанииРедактирования(0);
   КонецЕсли;
КонецПроцедуры

Процедура ПриНажатииПравойКнопки(сост,х,у,фсо)
   // предопределенная процедура при нажатии правой кнопки мыши
   // здесь надо проверить не произведен ли клик вне служебного реквизита при редактировании
   
   // получаем активный атрибут формы
   акт = Форма.АктивныйЭлемент();
   Если (акт = РедактируемаяКолонка) и (РедактируемаяКолонка <> "") Тогда
       // если активным является атрибут с идентификатором равным редактируемой колонки,
       // то проверим где произошло нажатие
       в = ""; л = ""; ши = ""; вы = "";
       // устанавливаем атрибут
       АтрибутФормы.УстановитьАтрибут(Форма,акт);
       // получаем его координаты
       АтрибутФормы.ПолучитьКоординаты(л,в,ши,вы);
       // проверяем попал ли клик мыши внутрь нашего служебного реквизита
       Если ((х - л) >= 0) и ((х - л) <= ши) и
            ((у - в) >= 0) и ((у - в) <= вы) Тогда
           // попал, продолжаем редактирование
           Возврат;
       КонецЕсли;
       // не попал, реквизит потерял фокус, отменяем редактирование
       ПриОкончанииРедактирования(0);
   КонецЕсли;
КонецПроцедуры

Процедура ЗначениеВыбрано()
   // вызов этой процедуры прописан в поле Формула всех служебных реквизитов
   // здесь производим действия по окончанию редактирования и переносу нового значения в ТЗ
   ПриОкончанииРедактирования();
КонецПроцедуры    // ЗначениеВыбрано


Процедура ПослеОткрытия()
   //Устанавливаем для Таблицы значений новый шрифт
   //Созданный при начале работы.
   АтрибутФормы.УстановитьАтрибут(Форма,"ТЗВвода");
   АтрибутФормы.шрифт=ГлШрифт;
   Окно=СоздатьОбъект("Окна");
   Высота = 0;
   Ширина = 0;
   Окно.ПолучитьРазрешение(Ширина,Высота);    
   Окно.РазмерОкна(Форма,475,410,);
   //Окно.МенюОкна(Форма,0,0,0,0);
   Окно.ЦентрироватьОкно(Форма);
   Окно.СтильОкна(Форма,1);  
КонецПроцедуры    // ПослеОткрытия

//*******************************************
Процедура Новый()
   ТЗВвода.НоваяСтрока();
   ТЗВвода.рСистемная="BRUSH["+ПолучитьЦвет(230,230,230)+"] FONTSET["+ГлШрифт+"] ";  
   ТЗВвода.рКво = 1;
   ТЗВвода.ТекущаяСтрока(ТЗВвода.КоличествоСтрок());  
   //Сервис.SendKeys("{END}");
   //ТЗВвода.ТекущаяКолонка(3);
   //ПриРедактированииТЗ(ТЗВвода.КоличествоСтрок());
КонецПроцедуры    

Процедура УдалитьСтроку()
   Попытка  
       БылиМзменения = 1;
       ТЗВвода.УдалитьСтроку();
   Исключение
   КонецПопытки;
КонецПроцедуры

Процедура Сформировать()

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

Процедура ПриОткрытии()
   Перем ТЗ;
   БылиМзменения = 0;  
   Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
       Распределение = Форма.Параметр.ПолучитьЗначение(1);
       Количество = Форма.Параметр.ПолучитьЗначение(2);
   Иначе
       Распределение = Форма.Параметр;
       Количество = 0;
   КонецЕсли;
   СтарРаспрелеление = Распределение;
   //Если ТекущаяДата() < Константа.НачалоРезервирования Тогда    
   //    СтатусВозврата(0);  
   //    Возврат;
   //КонецЕсли;
   ТЗ = глТаблицаЗаказов(Распределение);
                                     
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл  
       ТЗВвода.НоваяСтрока();
       ТЗВвода.рСистемная="BRUSH["+ПолучитьЦвет(230,230,230)+"] FONTSET["+ГлШрифт+"] ";
       ТЗВвода.рСклад = ТЗ.Склад;
       ТЗВвода.рСкладСтрокой = ТЗ.Склад.Наименование;    //  ?
(ПустаяСтрока(ТЗ.Склад.Кратко) = 1, ,ТЗ.Склад.Кратко)
       ТЗВвода.рЗаказ = ТЗ.Заказ;
       ТЗВвода.рКво = ТЗ.Кво;  
       ТЗВвода.рКомментарий = ТЗ.Комментарий;
   КонецЦикла;  
КонецПроцедуры        

Процедура ПриЗакрытии()  
   Выгружать = 1;
   // проверяем действительно ли надо закрывать форму
   Если МожноЗакрыть = 0 Тогда
       // нет, закрытие вызвано только для активизации ТЗ
       МожноЗакрыть = 1;
       // активизируем...
       Активизировать("ТЗВвода");
       // ... и отменяем закрытие
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;  
   
   Если ЗакпытьБезИзменений = 1 Тогда  
       Если БылиМзменения = 1 Тогда
           Если Вопрос("Записать изменения распределения?", 4) = 7 Тогда  
               Выгружать = 0;
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;  
   
   Если Выгружать = 1 Тогда
       // проверка количества
       ТЗВвода.ВыбратьСтроки();
       Пока ТЗВвода.ПолучитьСтроку() = 1 Цикл
           Если ТЗВвода.рКво = 0 Тогда  
               Сообщить("На складе " + СокрЛП(ТЗВвода.рСклад) + " под заказ " +
ТЗВвода.рЗаказ + " кол-во 0!");  
               //СтатусВозврата(0);
           КонецЕсли;
           СклСтр = СокрЛП(ТЗВвода.рСклад.Кратко);
           Если (Найти(СклСтр,"Подол")<>0) ИЛИ (Найти(СклСтр,"Красная")<>0)  Тогда
               Если (ПустоеЗначение(ТЗВвода.рКомментарий) = 1) Тогда
                   Сообщить("Для этого склада необходимо задать комментарий");  
                   СтатусВозврата(0);
               ИначеЕсли
СписокКомментариев.НайтиЗначение(СокрЛП(ТЗВвода.рКомментарий)) = 0 Тогда
                   Сообщить("Для этого склада необходимо задать допустимый
комментарий");  
                   СтатусВозврата(0);
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;
       
       Если ТЗВвода.КоличествоСтрок() > 0 Тогда
           //Если РабочаяДата() < Константа.НачалоРезервирования Тогда
           //    Если ПустаяСтрока(Распределение) = 0 Тогда
           //        Если Вопрос("Строка ""Распределение"" будет заменена!
Продолжить?",4) = 7 Тогда
           //            СтатусВозврата(1);
           //            //Возврат;
           //        КонецЕсли;
           //    КонецЕсли;
           //КонецЕсли;
           Распределение = "";
           ТЗВвода.ВыбратьСтроки();
           Пока ТЗВвода.ПолучитьСтроку() = 1 Цикл  
               Если ПустоеЗначение(ТЗВвода.рСклад) = 1 Тогда  
                   Предупреждение("В распределении обязательно указывается
склад!",10);  
                   СтатусВозврата(0);
                   Возврат;
               КонецЕсли;
               //Распределение = Распределение + СокрЛП(?
(ПустаяСтрока(ТЗВвода.рСклад.Кратко) = 1,ТЗВвода.рСклад.Наименование,ТЗВвода.рСклад.Кратко))
               //+ " #-" + СокрЛП(ТЗВвода.рЗаказ) + " шт-" + СокрЛП(ТЗВвода.рКво) +
Симв(160) + СокрЛП(ТЗВвода.рКомментарий) + ";  ";
               Если СтрДлина(Распределение) >=255  Тогда
                   Сообщить("Длинна распределения превышает допустимую -
255знаков");
                   Прервать;
               КонецЕсли;
               закр = СокрЛП(ТЗВвода.рЗаказ);
               Если Лев(закр,3) = "000" Тогда
                   закр = "1"+закр;
               КонецЕсли;
               Распределение = Распределение + СокрЛП(ТЗВвода.рКво) + "шт" +
Симв(160) + СокрЛП(закр) + Симв(160)+ СокрЛП(?(ПустаяСтрока(ТЗВвода.рСклад.Кратко) =
1,ТЗВвода.рСклад.Наименование,ТЗВвода.рСклад.Кратко)) + Симв(160) + СокрЛП(ТЗВвода.рКомментарий) +
";" + Симв(160);
           КонецЦикла;  
       КонецЕсли;  
       Форма.Параметр = Распределение;  
   Иначе
       Форма.Параметр = СтарРаспрелеление;
   КонецЕсли;
КонецПроцедуры    

Процедура ЗакрытьОкно()
   ЗакпытьБезИзменений = 1;
   МожноЗакрыть = 1;
   Форма.Закрыть();
КонецПроцедуры


//*******************************************  
СписокКомментариев = СоздатьОбъект("СписокЗначений");
   СписокКомментариев.ДобавитьЗначение("возврат");
СписокКомментариев.ДобавитьЗначение("Хранение");
СписокКомментариев.ДобавитьЗначение("Некондиция");
СписокКомментариев.ДобавитьЗначение("Рекламация");                                        
СписокКомментариев.ДобавитьЗначение("дост");
СписокКомментариев.ДобавитьЗначение("НП");
СписокКомментариев.ДобавитьЗначение("сборка");
СписокКомментариев.ДобавитьЗначение("Сервис");
СписокКомментариев.ДобавитьЗначение(" ");

// показываем всегда только основной слой
СписокСкладов = СоздатьОбъект("СписокЗначений");
Спр_МестаХранения = СоздатьОбъект("Справочник.МестаХранения");

Форма.ИспользоватьСлой("Основной");
// задаем структуру ТЗ
// для простоты делаем идентификаторы колонок такими же, как служебные реквизиты
ТЗВвода.НоваяКолонка("рСистемная"); //Не видимая служит для описания цвета ячеек и задания шрифта
// добавляем колонку, в которой не будет прямого ввода ("недоступная колонка")
ТЗВвода.НоваяКолонка("рСклад",,,,"Склад",2,,2);
ТЗВвода.НоваяКолонка("рСкладСтрокой",,,,"Склад",15);
ТЗВвода.НоваяКолонка("рЗаказ",,,,"Заказ",6);
ТЗВвода.НоваяКолонка("рКво","Число",5,0,"К-во",3);  
ТЗВвода.НоваяКолонка("рКомментарий",,,,"Комментарий",15);
ТЗВвода.ВидимостьКолонки("рСистемная",0);
ТЗВвода.ВидимостьКолонки("рСклад",0);
// сразу создаем несколько строк в ТЗ
// естественно, в рабочем варианте добавление строк может быть не таким прямолинейным
АтрибутФормы = СоздатьОбъект("АтрибутФормы");  
РасширениеФормы = СоздатьОбъект("РасширениеФормы");

МожноЗакрыть = 1;
РедактируемаяКолонка = "";
ЗакпытьБезИзменений = 0;

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика