Ограничена длина текстового поляВ форме обработки есть таблица, которая редактируется в обработке. Одно поле таблицы имеет
фиксированную длину. Где это задано, найти не могу. | | 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; |