Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.173] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Может складывать сюда те решения, которые вам помогли/понравились... ? а-ля каталог НСР (нестандартные решения)
Вчера, лазя по 1C.proclub.ru ... 1. Самомодифицирующийся код для 1Сv7. Форма документа: Процедура ПоКнПровести() тРегистр = СокрЛП(РегистрДвиж); //текстовое представление регистра движения спсПарам = СоздатьОбъект("СписокЗначений"); спсЗнИзм = СоздатьОбъект("СписокЗначений"); спсЗнРес = СоздатьОбъект("СписокЗначений"); тблИзм.Выгрузить(спсЗнИзм,,,"Значение"); тблРес.Выгрузить(спсЗнРес,,,"Значение"); спсПарам.ДобавитьЗначение(спсЗнИзм,"Измерения"); спсПарам.ДобавитьЗначение(спсЗнРес,"Ресурсы"); //формирование обработки проведения ТекстСкрипта = СоздатьОбъект("Текст"); ТекстСкрипта.ДобавитьСтроку("//_____________________________________________________________________________ |Процедура ОбработкаПроведения()"); Если спсРег.РазмерСписка()>0 Тогда //запишем таблицы измерений и ресурсов, чтобы потом взять оттуда значения (можно конечно и списками это сделать) ТекстСкрипта.ДобавитьСтроку("тблИзм = ЗначениеИзСтроки(ТаблицаИзмерений); |тблРес = ЗначениеИзСтроки(ТаблицаРесурсов); |Если (ТипЗначенияСтр(тблИзм)<>""ТаблицаЗначений"") или (ТипЗначенияСтр(тблРес)<>""ТаблицаЗначений"") Тогда | Сообщить(""Неверное значение таблицы Измерений или Ресурсов!""); | СтатусВозврата(0); | Возврат; |Иначе | Если (тблИзм.КоличествоСтрок()=0) или (тблРес.КоличествоСтрок()=0) Тогда | Сообщить(""Возможно у выбранного регистра нет измерений или ресурсов!""); | КонецЕсли; |КонецЕсли;"); тблИзм.ВыбратьСтроки(); //заполнение значений измерений Пока тблИзм.ПолучитьСтроку()=1 Цикл ТекстСкрипта.ДобавитьСтроку(тРегистр+"."+СокрЛП(тблИзм.Измерение)+" = тблИзм.ПолучитьЗначение("+тблИзм.НомерСтроки+",""Значение"");"); КонецЦикла; тблРес.ВыбратьСтроки(); //заполнение значений ресурсов Пока тблРес.ПолучитьСтроку()=1 Цикл ТекстСкрипта.ДобавитьСтроку(тРегистр+"."+СокрЛП(тблРес.Ресурс)+" = тблРес.ПолучитьЗначение("+тблРес.НомерСтроки+",""Значение"");"); КонецЦикла; Если ВидДвиж=1 Тогда ТекстСкрипта.ДобавитьСтроку(тРегистр+".ДвижениеПриходВыполнить();"); Иначе ТекстСкрипта.ДобавитьСтроку(тРегистр+".ДвижениеРасходВыполнить();"); КонецЕсли; КонецЕсли; ТекстСкрипта.ДобавитьСтроку("КонецПроцедуры //ОбработкаПроведения |//_____________________________________________________________________________ |Процедура ОбработкаУдаленияПроведения() |КонецПроцедуры //ОбработкаУдаленияПроведения"); ТекстСкрипта.Записать(КаталогИБ()+"make.txt"); Провести(); //ФС.УдалитьФайл(КаталогИБ()+"make.txt"); Форма.Закрыть(); //если убрать следующий ниже комментарий, //то при отмене проведения документа будет ругаться: "Не могу открыть файл: make.txt" //ФС.УдалитьФайл(КаталогИБ()+"make.txt"); КонецПроцедуры //ПоКнПровести И в модуле написано #ЗагрузитьИзФайла make.txt Вроде просто, но я бы до такого не додумалась... 2. Несколько табличных частей для 1Сv7 В шапке добавляется строковый реквизит неограниченной длины. На форму вешается ТЗ. При открытии формы пишется (пока на пробовала, но идея такова...) ТЗ = ЗначениеИзСтроки( <имя реквизита> ); Работа с ТЗ описывается, ессно, самостоятельно... То же можно делать и для справочников |
Сообщ.
#2
,
|
|
|
Цитата В шапке добавляется строковый реквизит неограниченной длины Этого делать не советуеться... если перевети базу с DBF на SQL, то возможны проблемы в работоспособности, а именно критеская ошибка...я уже с этим не однократно сталкивался... |
Сообщ.
#3
,
|
|
|
значит так:
есть документы, у них есть общие реквизиты, допустим "Автор", вот как раз то этот реквизит и был определен со стракой не определенного размера. и при открытии документа 1С'ка падала целиком, говорила что мол в приложении была допушина кретическая ошибка, приложение будет закрыто. и все, хоть ты трести...но это только в конфигурациях на базе SQL Server 2000.. , проблема решаеться элементарно, определяешь реквизит "Автор" строкой размера: 255, и все! Удачи! |
Сообщ.
#4
,
|
|
|
Цитата maxim84_ @ ..но это только в конфигурациях на базе SQL Server 2000.. Спасибо! Просто у меня SQL 7.0, и таких граблей я ещё не встречал. Это только для общих реквизитов, или вообще в любом реквизите шапки? Бо я ща как раз тулю таблицы в такой рекв-т, и 255 симвов там не хватит по-любому, а вдруг придется на 2000й SQL перебираться с этой конфой.. |
Сообщ.
#5
,
|
|
|
Вот сегодня увеличил размерность до 510 - работает. видимо такая реакция наблюдаеться только при не определенном размере.
Вот какой реквизит именно, я не в курсе, у меня такая трабла была только с общим реквизитом. |
Сообщ.
#6
,
|
|
|
Обсуждение глюка предагаю продолжить в Что-то вроде bug report, бо тут, типа оффтоп.. А в качестве извинения предлагаю новинку:
Новинка! В помощь работодателю. Данный диалог призван отделить выдующихся пользователей от безнадёжных при приёме на работу оператора "со знанием 1С"... Важно наблюдать за изменениями выражения лица испытуемого по мере углубления в суть вопроса. Имхо, забавно.. |
Сообщ.
#7
,
|
|
|
V8
Function Excel2ValueTable(FileName,LeftOffSet = 1,TopOffSet = 3) export Excel = new ComObject("Excel.Application"); Data = Excel.workbooks.Open(FileName).Sheets(1); Status("Excel Opened"); //ishem porvuju stroku i=TopOffSet; Text=""; cRow = data.Rows(i); while EmptyValue(cRow.cells(LeftOffSet).value) do i=i+1; cRow = data.Rows(i); enddo; ValueTable = new ТаблицаЗначений; Row = i; cRow = data.Rows(Row); i=0; while Not EmptyValue(cRow.cells(LeftOffSet+i).value) do ValueTable.columns.Add("Column"+i,,cRow.cells(LeftOffSet+i).value); i =i+ 1; enddo; //pervaja stroka dannyh Row = Row+1; cRow = data.Rows(Row); //idem vniz do pustoj stroki while Not EmptyValue(cRow.cells(LeftOffSet).value) do Status("Processing row: "+Row); NewRow = ValueTable.Добавить(); for each Column in ValueTable.Колонки do ColNum = ValueTable.Колонки.Индекс(Column); RealColNum = ColNum+LeftOffSet; Value = cRow.cells(RealColNum).value; NewRow.Установить(ColNum,Value); enddo;//po kolonkam excela Row = Row+1; cRow = data.Rows(Row); enddo; //Po Strokam excela Excel.ActiveWorkbook.Close(False); Excel.Quit(); return ValueTable; endFunction |
Сообщ.
#8
,
|
|
|
Обработка "Быстрый запуск" для 1Сv7.
Есть возможность при запуске 1С показывать маленькую паннельку, на которую можно добавлять а) Вызов внутренних отчетов б) Ввод документов в) Вызов внешних отчетов Возможность автозагрузки выбранных отчетов (так же требует доработки модулей отчетов). Как доп. возможность (сделала по просьбе "своего" бухгалтера) - сохранение последних открытых таблиц (правда это требует ручного добавления в КАЖДУЮ необходимую точку показа таблицы одной/двух строк.) Сам файл обработки, иконки и текст глобального модуля прилагаются. Для блокировки кнопки закрытия и изменения размеров списка при масштабировании используется компонента FormEx. Хм... Теоретически можно и автозагрузку сохраненных таблиц сделать... Если надо... Приложенный файл переименовать в ЕХЕ Прикреплённый файлMine._QL.SFX (59.27 Кбайт, скачиваний: 1573) |
Сообщ.
#9
,
|
|
|
Условие в запросе по значению периодического реквизита на произвольную дату.
(с)YAZZ ВыбДата и ВыбПодр - либо реквизиты формы, либо ранее определенные значения Запрос выбирает сотрудников, который на заданную дату относились к заданному подразделению. Функция ПолучитьПодразделение(ВП); Подр = ВП.Подразделение.Получить(ВыбДата); Если Подр=ВыбПодр Тогда Возврат 1; Иначе Возврат 0; КонецЕсли; КонецФункции Запрос: Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(ВывестиСписок) |Обрабатывать НеПомеченныеНаУдаление; |Без итогов; |Сотр = Справочник.Сотрудники.ТекущийЭлемент; |ТБ = Справочник.Сотрудники.Код; |ФИО = Справочник.Сотрудники.Наименование; |Подр = Справочник.Сотрудники.Подразделение.Наименование; |Кат = Справочник.Сотрудники.КатегорияПлательщикаПФР; |ДР = Справочник.Сотрудники.ДатаРождения; |Группировка ТБ без групп все ВошедшиеВЗапрос; |Группировка ФИО без групп все; |Условие(ПолучитьПодразделение(Сотр) = 1); |"; |
Сообщ.
#10
,
|
|
|
Как обойти перекрытие процедур глобального модуля
Наверняка иногда приходилось сожалеть о том, что предопределенные процедуры в модуле формы отчета / обработки перекрывают аналогичные из глобального модуля. Например, в таблице есть стандартные расшифровки для запуска отчетов стандартным списком в расшифровке ячейки таблицы, который обрабатывается в процедуре ОбработкаЯчейкиТаблицы() глобального модуля (типа кноп "Обновить","Настройка" в стандартных бух. отчетах), и есть расшифровки, обработчики которых не хочется совать в глобальный модуль (например, внешний отчет). На самом деле всё лечится очень даже просто. Почему сюда запостил, так это потому, что в имеющихся конфах подобного не нашел, значит - оригинально. Суть метода - заглушка-прокси для процедуры в глобальном модуле: //В примере есть в таблице кнопа "Перепровести все", у которой в расшифровке сидит строка "#Провести" //<-------- Глобальный модуль ----------> Процедура ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Экспорт //Стандартный обработчик, который так хочется вызвать //... КонецПроцедуры //ОбработкаЯчейкиТаблицы Процедура глОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Экспорт //Стаб-прокси, который нужен для "разименования" стандартной процедуры ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица); КонецПроцедуры //глОбработкаЯчейкиТаблицы //<-------- Модуль формы отчета ----------> Процедура ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Если Расшифровка = "#Провести" тогда СтандартнаяОбработка=0; ПровестиВсеДоки(Таблица); Иначе //Call global one with proxy глОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица); КонецЕсли; КонецПроцедуры //ОбработкаЯчейкиТаблицы Просто, но работает |
Сообщ.
#11
,
|
|
|
Приведу ссылку на неплохую статью:
Нетипичное использование компоненты УРБД в системе 1С:Предприятие 7.7 (статья) |
Сообщ.
#12
,
|
|
|
v7. Транслит. Может кому понадобится.
Функция Транслит(Стр) Экспорт Исх = СоздатьОбъект("СписокЗначений"); Кон = СоздатьОбъект("СписокЗначений"); Исх.ДобавитьЗначение("а");Кон.ДобавитьЗначение("a"); Исх.ДобавитьЗначение("б");Кон.ДобавитьЗначение("b"); Исх.ДобавитьЗначение("в");Кон.ДобавитьЗначение("v"); Исх.ДобавитьЗначение("г");Кон.ДобавитьЗначение("g"); Исх.ДобавитьЗначение("д");Кон.ДобавитьЗначение("d"); Исх.ДобавитьЗначение("е");Кон.ДобавитьЗначение("e"); Исх.ДобавитьЗначение("ж");Кон.ДобавитьЗначение("j"); Исх.ДобавитьЗначение("з");Кон.ДобавитьЗначение("z"); Исх.ДобавитьЗначение("и");Кон.ДобавитьЗначение("i"); Исх.ДобавитьЗначение("й");Кон.ДобавитьЗначение("i"); Исх.ДобавитьЗначение("к");Кон.ДобавитьЗначение("k"); Исх.ДобавитьЗначение("л");Кон.ДобавитьЗначение("l"); Исх.ДобавитьЗначение("м");Кон.ДобавитьЗначение("m"); Исх.ДобавитьЗначение("н");Кон.ДобавитьЗначение("n"); Исх.ДобавитьЗначение("о");Кон.ДобавитьЗначение("o"); Исх.ДобавитьЗначение("п");Кон.ДобавитьЗначение("p"); Исх.ДобавитьЗначение("р");Кон.ДобавитьЗначение("r"); Исх.ДобавитьЗначение("с");Кон.ДобавитьЗначение("s"); Исх.ДобавитьЗначение("т");Кон.ДобавитьЗначение("t"); Исх.ДобавитьЗначение("у");Кон.ДобавитьЗначение("u"); Исх.ДобавитьЗначение("ф");Кон.ДобавитьЗначение("f"); Исх.ДобавитьЗначение("х");Кон.ДобавитьЗначение("x"); Исх.ДобавитьЗначение("ц");Кон.ДобавитьЗначение("c"); Исх.ДобавитьЗначение("ч");Кон.ДобавитьЗначение("ch"); Исх.ДобавитьЗначение("ш");Кон.ДобавитьЗначение("sh"); Исх.ДобавитьЗначение("щ");Кон.ДобавитьЗначение("sch"); Исх.ДобавитьЗначение("ъ");Кон.ДобавитьЗначение("'"); Исх.ДобавитьЗначение("ы");Кон.ДобавитьЗначение("y"); Исх.ДобавитьЗначение("ь");Кон.ДобавитьЗначение("'"); Исх.ДобавитьЗначение("э");Кон.ДобавитьЗначение("e"); Исх.ДобавитьЗначение("ю");Кон.ДобавитьЗначение("yu"); Исх.ДобавитьЗначение("я");Кон.ДобавитьЗначение("ya"); Стр1 = Стр; Для Инд=1 По Исх.РазмерСписка() Цикл Истр = Исх.ПолучитьЗначение(Инд); Кстр = Кон.ПолучитьЗначение(Инд); Стр1 = СтрЗаменить(Стр1,Истр,Кстр); Стр1 = СтрЗаменить(Стр1,Врег(Истр),Врег(Лев(Кстр,1))+?(СтрДлина(Кстр)=1,"",Сред(Кстр,2,СтрДлина(Кстр)))); КонецЦикла; Возврат Стр1; КонецФункции КонецФункции |
Сообщ.
#13
,
|
|
|
Сообщ.
#14
,
|
|
|
Сообщ.
#15
,
|
|
|
// Делал сам: // {{{ // Функции работы с датой // Удобны например для получения разницы в днях между датами, получения дня от начала года/стролетия и т.д. // Вход: // Дат - Дата // Выход: Порядковый номер дня от начала года Функция глПолучитьДеньГода(Дат) Экспорт ДеньГода = 0; Для Н = 1 По ДатаМесяц(Дат)-1 Цикл ДеньГода = ДеньГода+ДатаЧисло(КонМесяца(Дата(ДатаГод(Дат),Н,1))); КонецЦикла; Возврат ДеньГода+ДатаЧисло(Дат); КонецФункции // Вход: // Дат - Дата // Выход: Порядковый номер дня от начала столетия Функция глПолучитьДеньСтолетия(Дат) Экспорт ДеньСтолетия = 0; Для Н = 1900 По ДатаГод(Дат)-1 Цикл ДеньСтолетия = ДеньСтолетия+глПолучитьДеньГода(Дата(Н,12,31)); КонецЦикла; Возврат ДеньСтолетия+глПолучитьДеньГода(Дат); КонецФункции // Вход: // Год - Год по которому нужно получить дату от его начала // День - День от начала года "Год" по которому нужно получить дату // Выход: Дата дня "День" от начала года "Год Функция глПолучитьДатуПоДнюГода(Год,День) Экспорт ДеньГода = 0; Для Н = 1 По 12 Цикл ДеньГода = ДеньГода+ДатаЧисло(КонМесяца(Дата(Год,Н,1))); Если ДеньГода >= День Тогда Чис = День-глПолучитьДеньГода(Дата(Год,Н,1))+1; Возврат Дата(Год,Н,Чис); КонецЕсли; КонецЦикла; Возврат Дата(Год,12,День-глПолучитьДеньГода(Дата(Год,12,1))+1); КонецФункции // Вход: // День - Порядковый номер дня от начала столетия // Выход: Дата этого дня Функция глПолучитьДатуПоДнюСтолетия(День) Экспорт ДеньСтолетия = 0; ПД = Цел(День/365); Для Н = 1900 По 1900+ПД Цикл ДеньСтолетия = ДеньСтолетия+глПолучитьДеньГода(Дата(Н,12,31)); Если ДеньСтолетия >= День Тогда Возврат глПолучитьДатуПоДнюГода(Н,День-глПолучитьДеньСтолетия(Дата(Н,1,1))+1); КонецЕсли; КонецЦикла; Возврат глПолучитьДатуПоДнюГода(ПД,День-глПолучитьДеньСтолетия(Дата(ПД,1,1))+1); КонецФункции // Вход: // Дат - Дата к которой нужно добавить/убавить дней // КоличествоДней - Количество дней которое нужно прибавить // Выход: Дата получаемая путём прибавления/убавления к дате "Дат" числа дней "КоличествоДней" Функция глДобавитьДнейКДате(Дат,КоличествоДней) Экспорт ДеньСтолетия=глПолучитьДеньСтолетия(Дат); Возврат глПолучитьДатуПоДнюСтолетия(ДеньСтолетия+КоличествоДней); КонецФункции // }}} |