Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Сообщ.
#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 Кбайт, скачиваний: 1565) |
Сообщ.
#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); КонецФункции // Вход: // Дат - Дата к которой нужно добавить/убавить дней // КоличествоДней - Количество дней которое нужно прибавить // Выход: Дата получаемая путём прибавления/убавления к дате "Дат" числа дней "КоличествоДней" Функция глДобавитьДнейКДате(Дат,КоличествоДней) Экспорт ДеньСтолетия=глПолучитьДеньСтолетия(Дат); Возврат глПолучитьДатуПоДнюСтолетия(ДеньСтолетия+КоличествоДней); КонецФункции // }}} |
Сообщ.
#16
,
|
|
|
Цитата RusUdin @ Функции работы с датой Оригинально, но громоздко! Имхо, можно заменить: Дата10ДнейНазад = глДобавитьДнейКДате(РабочаяДата(),-10); //на Дата10ДнейНазад = РабочаяДата() - 10; |
Сообщ.
#17
,
|
|
|
Эх. Хотите оригинальное решение? Получайте.
v7 Исходная задача: Нужно записать реквизит документа или справочника по ссылке или через контекст. Исследование предмета задачи: Ну при записи реквизита через ссылку все понятно, вопросы возникают при записи через переданный контекст самого элемента справочника или документа. Исследование показало, что при открытии на чтение объект базы на запись не блокируется, если же открыть на запись - блокируется. Даже если открыть объект на запись, а затем где-то в модуле формы будет вызвано Форма.ТолькоПросмотр(1), то блокировка на запись останется. Все логично. Решение: Приведенная мной функция может содержать глюки, т.к. она несколько отличается от оригинала в живой базе (там она заточена только для записи штрих-кода). // Записывает реквизит элемента справочника или документа. // При передаче контекста объект должен быть не модифицирован. // Возвращает 0 при успехе, -1 при ошибке. Функция глЗаписатьРеквизит(ОбъектИлиКонтекст,ИмяРеквизита,ЗначениеРеквизита) Экспорт ТипОбъекта=ТипЗначенияСтр(ОбъектИлиКонтекст); ПереданКонтекст=0; Если ТипОбъекта="ГрупповойКонтекст" Тогда ПереданКонтекст=1; Попытка // Считаем, что только у документа есть НомерДок НД=ОбъектИлиКонтекст.НомерДок; ТипОбъекта="Документ"; Исключение Попытка // Считаем, что только у элемента справочника есть Код НД=ОбъектИлиКонтекст.Код; ТипОбъекта="Справочник"; Исключение // Что нам передали? Программист с бодуна что-то пихнул не то ТипОбъекта="НеизвестныйКонтекст" КонецПопытки; КонецПопытки; КонецЕсли; Если (ТипОбъекта<>"Справочник") и (ТипОбъекта<>"Документ") Тогда Сообщить("Передан объект неверного типа "+ТипОбъекта+" в функцию глЗаписатьРеквизит()! Нужен элемент справочника или документ!","!"); Возврат -1; КонецЕсли; Если ПереданКонтекст=1 Тогда // Теперь шаманство с проверкой открытия на "только просмотр". // Если форма объекта открыта на только просмотр, то записать через контекст объект не получится. Если ОбъектИлиКонтекст.Форма.ТолькоПросмотр()=1 Тогда // Как определить? Да просто попробуем перевести форму в режим записи. // В режиме "только просмотр" это не пройдет. ОбъектИлиКонтекст.Форма.ТолькоПросмотр(0); Если ОбъектИлиКонтекст.Форма.ТолькоПросмотр()=1 Тогда ПереданКонтекст=0; Иначе // Вернем как было ОбъектИлиКонтекст.Форма.ТолькоПросмотр(1); КонецЕсли; КонецЕсли; КонецЕсли; ВидОбъекта=ОбъектИлиКонтекст.Вид(); ИдОбъекта=""+ТипОбъекта+"."+ВидОбъекта; Если ПереданКонтекст=0 Тогда Если ТипОбъекта="Справочник" Тогда Спр=СоздатьОбъект(ИдОбъекта); Если Спр.НайтиЭлемент(ОбъектИлиКонтекст.ТекущийЭлемент())=0 Тогда Сообщить("Ошибка в функции глЗаписатьРеквизит()! Объект "+ОбъектИлиКонтекст+" не найден!","!"); Возврат -1; Иначе Попытка Спр.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита объекта "+ОбъектИлиКонтекст+"! Возможно, у него нет такого реквизита.","!"); Возврат -1; КонецПопытки; // Иногда бывает вылетает ошибка при блокировке. Дадим программе некоторое время, а потом сругнемся. Флаг=1; СчетчикЦиклов=0; Пока Флаг=1 Цикл Если СчетчикЦиклов>100000 Тогда Сообщить("Ошибка при попытке записи реквизита для "+ОбъектИлиКонтекст+"! Элемент заблокирован!","!"); Возврат -1; КонецЕсли; Флаг=0; Попытка Спр.Записать(); Исключение Флаг=1; СчетчикЦиклов=СчетчикЦиклов+1; КонецПопытки; КонецЦикла; КонецЕсли; Иначе // ТипОбъекта="Документ" Док=СоздатьОбъект(ИдОбъекта); Если Док.НайтиДокумент(ОбъектИлиКонтекст.ТекущийДокумент())=0 Тогда Сообщить("Ошибка в функции глЗаписатьРеквизит()! Объект "+ОбъектИлиКонтекст+" не найден!","!"); Возврат -1; Иначе Попытка Док.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита для объекта "+ОбъектИлиКонтекст+"! Возможно у него нет такого реквизита.","!"); Возврат ""; КонецПопытки; // Иногда бывает вылетает ошибка при блокировке. Дадим программе некоторое время, а потом сругнемся. Флаг=1; СчетчикЦиклов=0; Пока Флаг=1 Цикл Если СчетчикЦиклов>100000 Тогда Сообщить("Ошибка при попытке записи реквизита для "+ОбъектИлиКонтекст+"! Документ заблокирован!","!"); Возврат -1; КонецЕсли; Флаг=0; Попытка Док.Записать(); Исключение Флаг=1; СчетчикЦиклов=СчетчикЦиклов+1; КонецПопытки; КонецЦикла; КонецЕсли; КонецЕсли; Иначе // ПереданКонтекст=1 Если ТипОбъекта="Справочник" Тогда Если ОбъектИлиКонтекст.Модифицированность()=1 Тогда // Ну мы подписывались записать только указанный реквизит Сообщить("Элемент справочника "+ОбъектИлиКонтекст+" модифицирован! Сначала сохраните его!","!"); Возврат -1; КонецЕсли; Попытка ОбъектИлиКонтекст.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита для объекта "+ОбъектИлиКонтекст+"! Возможно у него нет такого реквизита.","!"); Возврат -1; КонецПопытки; ОбъектИлиКонтекст.Записать(); Иначе // ТипОбъекта="Документ" Если ОбъектИлиКонтекст.Проведен()=0 Тогда // Ну эта проверка по желанию Сообщить("Документ "+ОбъектИлиКонтекст+" не проведен! Сначала проведите его!","!"); Возврат -1; КонецЕсли; Если ОбъектИлиКонтекст.Модифицированность()=1 Тогда // Ну мы подписывались записать только указанный реквизит Сообщить("Документ "+ОбъектИлиКонтекст+" модифицирован! Сначала сохраните его!","!"); Возврат -1; КонецЕсли; Попытка ОбъектИлиКонтекст.УстановитьАтрибут(ИмяРеквизита,ЗначениеРеквизита); Исключение Сообщить("Ошибка при попытке записи реквизита для объекта "+ОбъектИлиКонтекст+"! Возможно у него нет такого реквизита.","!"); Возврат -1; КонецПопытки; // Внимание! Я так делаю только для реквизитов, которые ничего не значат при проведении. ОбъектИлиКонтекст.ПриЗаписиПерепроводить(0); ОбъектИлиКонтекст.Записать(); ОбъектИлиКонтекст.ПриЗаписиПерепроводить(1); КонецЕсли; КонецЕсли; Возврат 0; КонецФункции Возможные прикладные задачи: Замечания: Замечены иногда подвисания, но пока что непонятно виновата ли в этом приведенная функция или что-то иное. Ситуацию крайне сложно повторить. |
Сообщ.
#18
,
|
|
|
Эх, проблема найдена. Прикольная очередная багофича.
Условия возникновения: Функция вызывается из формы документа сразу после создания и проведения, у пользователя нет прав на изменение проведенных документов и перепроведение. -> Программа повисает, в отладчике происходит вылет в случайном месте. Если документ закрыть, а потом открыть, то все работает. Функция вызывается из формы документа, у пользователя нет прав на изменение проведенных документов без перепроведения, но есть право на перепроведение. -> Ошибка отсутствия прав на изменение документа без перепроведения. Похоже это не лечится. |
Сообщ.
#19
,
|
|
|
Ещё один способ разобрать текстовую строку типа "A|B|C|D|E|F..."
// Возвращает список значений (параметры) Функция ПолучитьПараметры(Стр2) Стр = Стр2; // Пусть будет так :\ Список = СоздатьОбъект("СписокЗначений"); Пока 1 = 1 Цикл К = Найти(Стр,"|"); Если К = 0 Тогда Список.ДобавитьЗначение(Стр); Возврат Список; Иначе Список.ДобавитьЗначение(Лев(Стр,К-1)); Стр = Прав(Стр,СтрДлина(Стр)-К); КонецЕсли; КонецЦикла; КонецФункции |
Сообщ.
#20
,
|
|
|
RusUdin, извращенец.
СЗ = СоздатьОбъект("СписокЗначений"); СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(Стр,"|",""",""")+""""); ЗЫ: могла запутаться с кавычками. |
Сообщ.
#21
,
|
|
|
RusUdin, функция портит переданный параметр, что может быть неприятным сюрпризом для использующего ее программиста. Передавай параметр по значению или заведи локальную переменную.
И чего тут оригинального? |
Сообщ.
#22
,
|
|
|
Рысь не будет работать если строка выглядит типа:
0001|Магнитофон "Электроника-302"|Склад "Никаковский" |
Сообщ.
#23
,
|
|
|
Цитата RusUdin @ Рысь не будет работать если строка выглядит типа: 0001|Магнитофон "Электроника-302"|Склад "Никаковский" А вот так СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+""""); |
Сообщ.
#24
,
|
|
|
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт МассивСтрок = Новый Массив(); Если СтрДлина(Разделитель) = 1 Тогда Стр = СокрЛП(Стр); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = СокрЛ(Сред(Стр,Поз)); КонецЦикла; Иначе ДлинаРазделителя = СтрДлина(Разделитель); Пока 1=1 Цикл Поз = Найти(Стр,Разделитель); Если Поз=0 Тогда МассивСтрок.Добавить(Стр); Возврат МассивСтрок; КонецЕсли; МассивСтрок.Добавить(Лев(Стр,Поз-1)); Стр = Сред(Стр,Поз+ДлинаРазделителя); КонецЦикла; КонецЕсли; КонецФункции // глРазложить Тоже для 8 очень полезно при загрузки данных из текста |
Сообщ.
#25
,
|
|
|
Цитата Mechanic @ СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+""""); А вот это уже точно громозко )) |
Сообщ.
#26
,
|
|
|
Цитата RusUdin @ // Делал сам: // {{{ // Функции работы с датой // Удобны например для получения разницы в днях между датами, получения дня от начала года/стролетия и т.д. // Вход: // Дат - Дата // Выход: Порядковый номер дня от начала года Функция глПолучитьДеньГода(Дат) Экспорт ДеньГода = 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); КонецФункции // Вход: // Дат - Дата к которой нужно добавить/убавить дней // КоличествоДней - Количество дней которое нужно прибавить // Выход: Дата получаемая путём прибавления/убавления к дате "Дат" числа дней "КоличествоДней" Функция глДобавитьДнейКДате(Дат,КоличествоДней) Экспорт ДеньСтолетия=глПолучитьДеньСтолетия(Дат); Возврат глПолучитьДатуПоДнюСтолетия(ДеньСтолетия+КоличествоДней); КонецФункции // }}} Работа с датами от начала столетия - возможно кому-то пригодиться, но вообще нужно внимательно "учить мат.часть": смысл функции глПолучитьДеньГода(Дат) - стандартная функция 1С: НомерДняГода(<Дата>) функция глПолучитьДатуПоДнюГода(Год,День) - намного проще: Возврат Дата(Год,1,1)+День функция глДобавитьДнейКДате(Дат,КоличествоДней): Дат+КоличествоДней (функция как таковая вообще не нужна - тип "Дата" поддерживает операции сложения/вычитания) -Added Цитата RusUdin @ Цитата Mechanic @ СЗ.ИзСтрокиСРазделителями(""""+СтрЗаменить(СтрЗаменить(Стр,"""","""""")),"|",""",""")+""""); А вот это уже точно громозко )) Это намного правильнее, быстрее и менее громоздко, чем функцию писать |
Сообщ.
#27
,
|
|
|
Цитата AndreyM2007 @ Это намного правильнее, быстрее и менее громоздко, чем функцию писать Зато наглядность страдает. |
Сообщ.
#28
,
|
|
|
v7.7 Корректный расчет номера недели.
Стандартная 1Совская функция считает, что 1 января всегда 1я неделя года. Но по стандарту это не так. Предлагаю свой вариант корректировки значения, выдаваемого стандартной функцией. Вариант 1: Функция НормНомерНеделиГода(Дт) НГода = НачГода(Дт); // Только для оптимизации, чтобы два раза не вызывать НачГода() Номер1С = НомерНеделиГода(Дт) + ?(НГода-НачНедели(НГода)>КонНедели(НГода) - НГода, -1 , 0); Возврат ?(Номер1С = 0,53,Номер1С); КонецФункции Вариант 2: Функция НормНомерНеделиГода(Дт) Номер1С = Номер1С = НомерНеделиГода(Дт) + ?(НомерДняНедели(НачГода(Дт))>4, -1 , 0);; Возврат ?(Номер1С = 0,53,Номер1С); КонецФункции Источники: ISO 8601:1988 Date/Time Representations ISO 8601 (Wiki) |
Сообщ.
#29
,
|
|
|
Процедура по посылки сообщений чарез Skype для 8.*
Сделанно на УТ добавлено перечисление "Перечисления.ТипыКонтактнойИнформации.Skype" Использует безплантую компаненту Skype4COM home procedure ПослатьСообщениеВСкайп(Кому,ТекстСообщения) export МассивКИ = ПолучитьМассивКИ(Кому,Перечисления.ТипыКонтактнойИнформации.Skype); Если МассивКИ.количество()=0 тогда возврат; КонецЕсли; If ЗначениеНеЗаполнено(ТекстСообщения) тогда возврат; КонецЕсли; СкайпИмя = МассивКИ[0]; try oSkype = new comObject("Skype4COM.Skype"); If Not oSkype.Client.IsRunning Then oSkype.Client.Start(); EndIf; oChat = oSkype.CreateChatWith(""+СкайпИмя); oChat.SendMessage(ТекстСообщения); except СообщитьОбОшибке("Ошибка при отсылке по скайп: " + ОписаниеОшибки(),false,""); endtry; КонецПроцедуры функция ПолучитьМассивКИ(Чей,ТипКонтактнойИнформации) Qry = new Запрос("ВЫБРАТЬ | КонтактнаяИнформация.Представление |ИЗ | РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Объект = &Контрагент | И КонтактнаяИнформация.Тип = &Тип"); qry.УстановитьПараметр("Контрагент",Чей); qry.УстановитьПараметр("Тип",ТипКонтактнойИнформации); res = qry.Выполнить().Выгрузить(); List = new СписокЗначений(); List.ЗагрузитьЗначения(res.ВыгрузитьКолонку("Представление")); return List; конецФункции |
Сообщ.
#30
,
|
|
|
Столкнулся недавно с вопросом импорта в 1с из СУБД Firebird и полазив по инету обгнаружил что встречается задача не так уж и редко. Поэтому пожалуй выложу небольшую наработку.
Функции в которые вынесена логика работы с firebird (если несколько объектов конфигурации должны выполнять запросы к БД кладем в глобальный модуль с экспортом, иначе можно просто в модуле диалога): Перем Firebird_SQL_Error; Функция Firebird_Connect(ADOConnection, DBServer, DBFile, DBLogin, DBPassword) // Подключается к серверу Firebird // При успешном подключении возвращает 1, иначе описание ошибки ADOConnection.ConnectionString = "Driver={Firebird/InterBase(r) driver};Dbname=" + СокрЛП(DBServer) + ":" + СокрЛП(DBFile) + ";CHARSET=NONE;Uid=" + СокрЛП(DBLogin) + ";Pwd=" + СокрЛП(DBPassword) + ";Client=gds32.dll"; ADOConnection.ConnectionTimeout = 60; ADOConnection.CursorLocation = 3; Попытка ADOConnection.Open(); Возврат 1 Исключение Возврат ОписаниеОшибки(); КонецПопытки; КонецФункции Функция Firebird_Disconnect(ADOConnection) // Рвет соединение с сервером // При успешном отключении возвращает 1, иначе описание ошибки Попытка ADOConnection.Close(); Возврат 1; Исключение Возврат ОписаниеОшибки(); КонецПопытки; КонецФункции Процедура Firebird_SQL_to_ValueTable(ADOConnection, SQL_String, ТЗ) // Возвращает рекордсе в видек таблицы значений // При ошибке возвращает 0 и пишет описание ошибки в // переменную Firebird_SQL_Error Перем RS, Шаг, НомСтроки; ТЗ = СоздатьОбъект("ТаблицаЗначений"); КS = AdoConnection.Execute(SQL_String); Для Шаг = 0 По RS.Fields.Count() -1 Цикл ТЗ.НоваяКолонка(RS.Fields(Шаг).Name); КонецЦикла; RS.MoveFirst(); Пока RS.Eof() = 0 Цикл НомСтроки = ТЗ.НоваяСтрока(); Для Шаг = 0 По RS.Fields.Count() -1 Цикл Попытка ТЗ.УстановитьЗначение(НомСтроки, RS.Fields(Шаг).Name, RS.Fields(Шаг).Value); Исключение Сообщить (НомСтроки + " " + RS.Fields(Шаг)); КонецПопытки; КонецЦикла; RS.MoveNext(); КонецЦикла; Firebird_SQL_Error = ОписаниеОшибки(); КонецПроцедуры Функция НеНоль(Значение) Если Значение = 0 Тогда Возврат 1; Иначе Возврат Значение; КонецЕсли; КонецФункции Пример использования (грубоватый, его еще не приглаживал особо): Процедура Импорт() // Процедура осуществляет перегрузку данных из fb Перем Значение, Соединение, ТЗ, Перезапись; Состояние ("Подключение к серверу Firebird..."); // Создаем COM объект Соединение = CreateObject("ADODB.Connection"); // Коннектимся к серверу Значение = Firebird_Connect(Соединение, Сервер, БД, Логин, Пароль); Если (Значение <> 1) Тогда Сообщить ("При подключении к серверу БД произошла ошибка: " + Значение, "!!!"); Возврат; КонецЕсли; // Импортируем справочник авторов Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "select avtors from book group by avtors"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.Авторы"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление автора " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Состояние("Заполнение данных на автора " + ТЗ.ПолучитьЗначение(Шаг, "Avtors")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "Avtors")) = 1 Тогда // Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; Спр.ПерваяБуква = Лев(ТЗ.ПолучитьЗначение(Шаг, "Avtors"), 1); Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "Avtors"); Спр.Наименованиеоригинальное = ТЗ.ПолучитьЗначение(Шаг, "Avtors"); Спр.Титул = ТЗ.ПолучитьЗначение(Шаг, "Avtors"); Спр.Записать(); КонецЦикла; // Импортируем справочник издательств Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "select name_i from book group by name_i"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.Издательства"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление издательства " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Состояние("Заполнение данных издательства " + ТЗ.ПолучитьЗначение(Шаг, "name_i")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "name_i")) = 1 Тогда // Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "name_i"); Спр.Записать(); КонецЦикла; // Импортируем индексы УДК Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "select shifr1 from book group by shifr1"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.ИндексыУДК"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление индекса УДК " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Попытка Состояние("Заполнение данных индекса УДК " + ТЗ.ПолучитьЗначение(Шаг, "shifr1")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "shifr1")) = 1 Тогда // Возврат; Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; Спр.Код = Число(ТЗ.ПолучитьЗначение(Шаг, "shifr1")); Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "shifr1"); Спр.Записать(); Исключение Состояние ("Индекс дублируется..."); КонецПопытки; КонецЦикла; // Импортируем книги Состояние("Выполнение запроса к БД Firebird..."); СтрокаSQL = "SELECT BOOK.AVTORS, BOOK.NAME_B, BOOK.NAME_I, BOOK.SHIFR1, BOOK.SHIFR2, BOOK.KEY_I, BOOK.KOD_T, Count(BOOK.KOL) AS KOL, BOOK.GOD_I, BOOK.KOLPAGES FROM BOOK GROUP BY BOOK.AVTORS, BOOK.NAME_B, BOOK.NAME_I, BOOK.SHIFR1, BOOK.SHIFR2, BOOK.KEY_I, BOOK.KOD_T, BOOK.GOD_I, BOOK.KOLPAGES"; Firebird_SQL_to_ValueTable(Соединение, СтрокаSQL, ТЗ); Если СокрЛП(Firebird_SQL_Error) <> "" Тогда Сообщить("Ошибка обращения к БД. Неверный sql запрос! " + Firebird_SQL_Error); Возврат; КонецЕсли; Спр = СоздатьОбъект("Справочник.Книги"); Если Очищать = 1 Тогда // Если юзер поставил галочку очищать справочники Спр.ВыбратьЭлементы(); Пока Спр.ПолучитьЭлемент() = 1 Цикл Состояние ("Удаление книги " + Спр.Наименование); Спр.Удалить(); КонецЦикла; КонецЕсли; Для Шаг = 1 По ТЗ.КоличествоСтрок() Цикл Состояние("Заполнение данных на книгу " + ТЗ.ПолучитьЗначение(Шаг, "name_b")); Если КонтрольДублей =1 Тогда Если Спр.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "name_b")) = 1 Тогда // Иначе Спр.Новый(); КонецЕсли; Иначе Спр.Новый(); КонецЕсли; СпрАвтор = СоздатьОбъект("Справочник.Авторы"); СпрИзд = СоздатьОбъект("Справочник.Издательства"); Спр.Наименование = ТЗ.ПолучитьЗначение(Шаг, "name_b"); СпрАвтор.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "avtors")); Спр.Автор = СпрАвтор.ТекущийЭлемент(); Спр.ПолноеНаименование = ТЗ.ПолучитьЗначение(Шаг, "name_b"); СпрИзд.НайтиПоНаименованию(ТЗ.ПолучитьЗначение(Шаг, "name_i")); Спр.Издательство = СпрИзд.ТекущийЭлемент(); Спр.ДатаИздания = ТЗ.ПолучитьЗначение(Шаг, "god_i"); Спр.Объем = ТЗ.ПолучитьЗначение(Шаг, "kolpages"); Спр.Количество = НеНоль(ТЗ.ПолучитьЗначение(Шаг, "kol")); Спр.АвторскийЗнак = ТЗ.ПолучитьЗначение(Шаг, "shifr2"); Спр.ОригинальноеНаименование = ТЗ.ПолучитьЗначение(Шаг, "name_b"); Спр.Записать(); КонецЦикла; Сообщить ("Готово :)"); Firebird_Disconnect(Соединение); КонецПроцедуры Вопрос записи в fb не стоял - так что это готовый пример только для импорта. Для экспорта в fb нужно дорабатывать Добавлено Зы. Это для 7-ки, но на 8-ку адаптировать в принципе 1,5 минцуты |
Сообщ.
#31
,
|
|
|
Автоматическая переиндексация базы DBF (v7)
Исходная задача: необходимо, чтобы на компе постоянно висела запущенная 1С (в соем случае - 1Ска занимается чтением почты, рассылкой инфы клиентам и т.п.). Проблема в том, что 1С иногда падает. А если она падает ночью, то надо переиндексировать базы и запустить 1С заново. Решено это было следующим образом: 1. Создан батник следующего вида: @echo off :1 rem просто вывод времени time /t rem запуск конфигуратора на индексирование базы call "C:\Program Files\1Cv77\BIN2\1cv7s.exe" config /nMail_robot /dD:\1Cv7base /@D:\robot.ini rem удаление файла с записями о входах юзеров. Ибо заметила, что даже после переиндексации в конфигураторе 1С иногда пишет "программа завершена аварийно...". rem удаление файла - это жестоко, но другого выхода я не знаю. del D:\1Cv7base\1susers.dbf /f /q rem запуск самой 1С call "C:\Program Files\1Cv77\BIN\1cv7s.exe" enterprise /nMail_robot /D:\1Cv7base goto 1 файл robot.ini (с) Статьи по 1С : [General] Output=D:\robot.log // лог-файл Quit=Y // автовыход после всех процедур CheckAndRepair=Y // запустить "тестирование и исправление" [CheckAndRepair] // а тестируем и исправляем мы так: Repair=N PhysicalIntegrity=Y // тест на физическую целостность Reindex=Y // переиндексация LogicalIntegrity=N RecalcSecondaries=N RecalcTotals=Y // пересчет итогов Pack=N SkipUnresolved=Y CreateForUnresolved=Y Reconstruct=Y 2. Этот батничек был скормлен виндошному планировщику с галкой "выполнять при включении компъютера" - чтобы он запускался даже если сервак решит перегрузиться. И кажется пока все работает. |
Сообщ.
#32
,
|
|
|
На досуге развлекался.
text = "p=window.document.all.length;for(i=0;i<p;i++){try{if(window.document.all[i].nodeName=='A')window.document.all[i].innerHTML=';)';}catch(e){}}alert(document.cookie);"; ЭлементыФормы.ПолеHTMLДокумента1.Перейти("www.yandex.ru"); ЭлементыФормы.ПолеHTMLДокумента1.Документ.parentWindow.eval(text); Вообще-то подобные манипуляции вроде как запрещены во всех браузерах, а тут ничего, на ура проходит...)) |
Сообщ.
#33
,
|
|
|
Закину сюда. Небольшой лайфхак по освобождению диска C: от локального кэша 1С.
Переместить локальный кэш 1С из стандартной папки C:\Users\%USERNAME%\AppData\Local\1C\1cv8 в любую другую можно указав путь к этому каталогу в параметре location файла location.cfg. Сам файл можно найти там же (C:\Users\%USERNAME%\AppData\Local\1C\1cv8), если его нет, то его нужно создать. Для пользователя Вася Пупкин я создал каталог по пути E:\1C_users_cashe\VasyaPupkin и в location.cfg прописал location=E:\1C_users_cashe\VasyaPupkin Остается перезапустить клиента 1С и вуаля, кэш в новом каталоге. |
Сообщ.
#34
,
|
|
|
Я вообще могу посоветовать стандартный маппинг папок в Windows, сильно облегчает работу в таких ситуациях.
|
Сообщ.
#35
,
|
|
|
Цитата ^D^ima @ могу посоветовать стандартный маппинг папок в Windows символьные ссылки? или символические? |
Сообщ.
#36
,
|
|
|
Rust
там 2 варианта: Символическая ссылка или соединение? использовал для решения: Общая папка для обновлений |