Временные таблицы 1С

Временные таблицы часто используются как для реализации сложных запросов, так и для их оптимизации.Читать далее →

Загрузка данных из Excel в MySQL с помощью PHP

Не так давно появилась задача — загрузить данные из Ecxel файла в базу сайта, и реализовать механизм так, чтобы быстро можно было обновлять эти данные, т.е. загружать новый файл. Решил попробовать парсер Excel-файлов phpExcelReader, но сколько не бился с ним, получал ошибку типа «… is not readable». Поэтому решил использовать библиотеку PHPExcel.

Загружать будем прайс-лист:

Артикул Наименование Количество Цена Валюта Единица
123456 Апельсин 20 50000 руб килограмм
123457 Мандарин 20 54000 руб килограмм
123458 Яблоко 50 23500 руб килограмм

В таблицу со структурой:

id article name
quantity
price
currency
unit

Скачав архив с библиотекой и открыв его вы увидите несколько папок и файлов — это описание и примеры использования библиотеки. Нам понадобится папка «Classes» — распаковываем архив и загружаем её, например, в корень сайта.

Файл excel можно загрузить в нужную папку на сервере, например uploads, через ftp сервер или создать страницу загрузки с <input type="file" name="upload_file". Для меня конечно второй вариант был в приоритете (как реализовать загрузку файла на сервер я писал в статье «Отправка формы и файлов через Ajax»).

Итак, предположим, что форму загрузки мы сделали, библиотеку подключили, начнем писать скрипт обработки файла и загрузки в базу данных.

include 'db_conn.php'; // подключаемся к базе данных
$loadfile = $_POST['file_name']; // получаем имя загруженного файла
require_once $_SERVER['DOCUMENT_ROOT']."/Classes/PHPExcel/IOFactory.php"; // подключаем класс для доступа к файлу
$objPHPExcel = PHPExcel_IOFactory::load($_SERVER['DOCUMENT_ROOT']."/uploads/".$loadfile);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) // цикл обходит страницы файла
{
  $highestRow = $worksheet->getHighestRow(); // получаем количество строк
  $highestColumn = $worksheet->getHighestColumn(); // а так можно получить количество колонок

  for ($row = 1; $row <= $highestRow; ++ $row) // обходим все строки
  {
    $cell1 = $worksheet->getCellByColumnAndRow(0, $row); //артикул
    $cell2 = $worksheet->getCellByColumnAndRow(1, $row); //наименование
    $cell3 = $worksheet->getCellByColumnAndRow(2, $row); //количество
    $cell4 = $worksheet->getCellByColumnAndRow(3, $row); //цена
    $cell5 = $worksheet->getCellByColumnAndRow(4, $row); //валюта
    $cell6 = $worksheet->getCellByColumnAndRow(5, $row); //единица измерения
    $sql = "INSERT INTO `price` (`article`,`name`,`quantity`,`price`,`currency`,`unit`) VALUES
('$cell1','$cell2','$cell3','$cell4','$cell5','$cell6')";
    $query = mysql_query($sql) or die('Ошибка чтения записи: '.mysql_error());
  }
}

 

В принципе, второй цикл можно усовершенствовать, используя количество колонок, но у меня файл всегда будет стандартный, поэтому не вижу в этом смысла.

На CyberForum.ru нашел перевод документации к PHPExcel, который сделал SrgKord скачать можно тут: Документация разработчика PHPExcel (RUS).7z

Как перебрать все элементы из определенной группы справочника

Есть несколько вариантов того, как можно получить элементы из определенной группы справочника. Предположим, что у нас на форме есть поле выбора ПолеВводаРодитель в котором указываем родителя (группу).

Вариант 1

[php]
Выборка = Справочники.Номенклатура.Выбрать(ПолеВводаРодитель);
Пока Выборка.Следующий() Цикл
Наименование = Выборка.Наименование;
КонецЦикла;
[/php]

Вариант 2

[php]
Запрос = Новый Запрос(&quot;
|ВЫБРАТЬ
| Ссылка,
| Наименование
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Родитель = &amp;Родитель
|АВТОУПОРЯДОЧИВАНИЕ&quot;);
Запрос.УстановитьПараметр(&quot;Родитель&quot;, ПолеВводаРодитель);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Наименование = Результат.Наименование;
КонецЦикла;
[/php]

Вариант 3 (с иерархией)

[php]
Выборка=Справочники.Номенклатура.ВыбратьИерархически(ПолеВводаРодитель);
Пока Выборка.Следующий() Цикл
Наименование = Выборка.Наименование;
КонецЦикла;
[/php]

Вариант 4 (с иерархией)

[php]
Запрос = Новый Запрос(&quot;
|ВЫБРАТЬ
| Ссылка,
| Наименование
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Родитель В ИЕРАРХИИ(&amp;Родитель)
|АВТОУПОРЯДОЧИВАНИЕ&quot;);
Запрос.УстановитьПараметр(&quot;Родитель&quot;, ПолеВводаРодитель);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Наименование = Результат.Наименование;
КонецЦикла;
[/php]

Добавление записей в регистр сведений

Как добавить записи в независимый регистр сведений?
Для добавления отдельной записи в регистр сведений, не подчиненный регистратору, можно использовать объект РегистрСведенийМенеджерЗаписи.<имя>.
Например, для того, чтобы в независимый регистр сведений ЗначенияСвойствОбъектов с измерениями Объект, Свойство и ресурсом Значение добавить одну запись, содержащую значение некоторого свойства выбранной номенклатуры, можно использовать следующий код:

[php]
МенеджерЗаписи = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ПолеВводаНоменклатура;
МенеджерЗаписи.Свойство = ПолеВводаСвойствоНоменклатуры;
МенеджерЗаписи.Значение = ПолеВводаЗначениеСвойства;
МенеджерЗаписи.Записать();
[/php]

В результате выполнения этого кода новая запись будет добавлена в регистр, или, если регистр уже содержит запись с выбранными значениями измерений Объект и Свойство, — существующая запись будет заменена новой.
Если требуется добавить несколько записей в регистр сведений, можно использовать объект РегистрСведенийНаборЗаписей.<имя>.
Например, для того, чтобы в тот же самый регистр сведений ЗначенияСвойствОбъектов добавить несколько записей о значениях различных свойств выбранной номенклатуры, можно использовать следующий код (предполагается, что свойства и соответствующие им значения находятся в таблице значений ТаблицаСвойств, сформированной заранее):

[php]
НаборЗаписей = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(ПолеВводаНоменклатура);
Для Каждого СтрокаТаблицы Из ТаблицаСвойств Цикл
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Объект = ПолеВводаНоменклатура;
НоваяЗапись.Свойство = СтрокаТаблицы.Свойство;
НоваяЗапись.Значение = СтрокаТаблицы.ЗначениеСвойства;
КонецЦикла;
НаборЗаписей.Записать();
[/php]

В результате выполнения этого кода новые записи будут добавлены в регистр, или, если регистр уже содержит записи с указанным значением измерения Объект (по которому установлен отбор в наборе записей), — существующие записи будут заменены новыми.

Как к полю выбора или к полю списка «прицепить» список значений

Как программно заполнить поле выбора или поле списка из списка значений?Читать далее →

Короткие условия и пример работы с ними

В системе 1С присутствуют сокращенные формы условий, используя знак «?», первая похожа на excel и простое условие которое возвращает значение «Истина» или «Ложь».

Читать далее →

Увеличение изображения по клику

Статья устарела! Более интересное решение тут!

UPD от 04.05.2016 Если у вас нет желания разбираться с кодом, то приглашаю к тестированию моего плагина Litezoom!

Изображения на сайтах встречаются довольно часто и при этом они бывают больших размеров, но дизайн сайта далеко не всегда позволяет разместить её в полном формате. Поэтому нужно придумать способ, который бы позволял увеличивать их. Способов множество, но мне нравится на jquery.

Итак, предположим у нас есть страничка:

/* Блок в котором мы будем отображать большую картинку */
<div id="img_big_block" style="display: none;"><img src="zoo2394.jpg" width="800px"></div>

/* Блок с картинкой */
<div class="img_block">
  <img src="zoo2394.jpg">
</div>

Наведем красоту и пропишем стили для нашей картинки:

.img_block {
  padding: 5px 5px 5px 5px;
}
/* Стиль картинки на странице */
.img_block img {
  width:300px;
  border: 2px solid #ccc;
}
/* Стиль картинки на странице при наведении */
.img_block img:hover {
  width:300px;
  border: 2px solid #D4DEE8;
  cursor: pointer;
}
/* Скрытый контейнер */
#img_big_block {
  position: absolute;
  display: none;
  left: 50%;
  margin-left: -350px;
  z-index: 999;
  top: 100px;
  border: 1px solid #D4DEE8;
}

Осталось написать скрипт, отвечающий за увеличение картинки:

$(document).ready(function() {
  // Обрабатывает клик на картинке
  $('.img_block img').click(function() {
    // Получаем адрес картинки
    var imgAddr = $(this).attr(&quot;src&quot;);
    // Задаем свойство SRC картинке, которая в скрытом диве.
    $('#img_big_block img').attr({src: imgAddr});
    // Показываем скрытый контейнер
    $('#img_big_block').fadeIn('slow');
  });

  // Обрабатывает клик по большой картинке
  $('#img_big_block').click(function() {
    $(this).fadeOut();
  });
});

Вот что у нас получилось

[codepen_embed height=»268″ theme_id=»0″ slug_hash=»VeJmmO» default_tab=»result» user=»AmateR»]See the Pen <a href=’http://codepen.io/AmateR/pen/VeJmmO/’>VeJmmO</a> by Aleksei (<a href=’http://codepen.io/AmateR’>@AmateR</a>) on <a href=’http://codepen.io’>CodePen</a>.[/codepen_embed]

Пример полностью:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
// Обрабатывает клик на картинке
$('.img_block img').click(function() {
// Получаем адрес картинки
var imgAddr = $(this).attr("src");
// Задаем свойство SRC картинке, которая в скрытом диве.
$('#img_big_block img').attr({src: imgAddr});
// Показываем скрытый контейнер
$('#img_big_block').fadeIn('slow');
});
// Обрабатывает клик по большой картинке
$('#img_big_block').click(function() {
$(this).fadeOut();
});
});
</script>

<style type="text/css">
.img_block {
padding: 5px 5px 5px 5px;
}
/* Отображение миниатюр */
.img_block img {
width:300px;
border: 2px solid #ccc;
}
/* Выделение миниатюры при наведении */
.img_block img:hover {
width:300px;
border: 2px solid #D4DEE8;
cursor: pointer;
}
/* Скрытый контейнер с большим изображением */
#img_big_block {
position: absolute;
display: none;
left: 50%;
margin-left: -350px;
z-index: 999;
top: 100px;
border: 1px solid #D4DEE8;
}
</style>

</head>

<!-- Блок в котором мы будем отображать большую картинку -->
<div id="img_big_block"><img src="" width="800px"></div>

<!-- Блок с миниатюрами -->
<div class="img_block">
<img src="zoo2394.jpg">
</div>

</html>

 

Плавное отображение и скрытие блоков на JQuery

Функция, которая скрывает и показывает элементы страницы:

function diplay_hide_show(block)
{
  if ($(block).css('display') == 'none') {$(block).animate({height: 'show'}, 1000);}
  else {$(block).animate({height: 'hide'}, 1000);}
}

 

Работа функции: если в стиле блока, id которого передается в функцию как переменная «block», стоит значение параметра «display: none», то этот блок необходимо сделать видимым, иначе скрыть его. Аргумент функции animate — 1000 — задержка анимации в мс.
Пример работы функции:

<a href="#" onclick="diplay_hide_show('#size');"> Ввести размер </a>
<div id="size">
  <select id="size_select">
    <option value="" selected="selected">Выберите размер...</option>
    <option value="900х600">900 х 600</option>
    <option value="800х600">800 х 600</option>
    <option value="800х500">800 х 500</option>
    <option value="600х400">600 х 400</option>
    <option value="300х200">300 х 200</option>
  </select>
</div>

 

Работа с Word из 1С

Для заключения договоров с контрагентами был разработан договор в Word, который менеджеры заполняли вручную. Была поставлена задача автоматизировать этот процесс.
Для начала потребовалось создать шаблон из документа договора, проще говоря — сохранить уже существующий договор с расширением «Шаблон Word 97-2003 (*.dot)». В местах, где необходима подстановка указываем параметры. Например:

[Организация], именуемое в дальнейшем «Исполнитель», в лице директора [ФИОДиректора], действующей на основании Устава, и [Заказчик], именуемое в дальнейшем «Заказчик», в лице директора [ФИОДиректораЗаказчика]

Где [Организация], [ФИОДиректора], [Заказчик] и [ФИОДиректораЗаказчика] это и есть наши параметры. Параметры можно указывать любым удобным нам способом, например можно вместо [] использовать {} или <>.
Оформленный таким образом документ загружаем в 1С в качестве макета с типом макета – Active document.

Далее в соответствующем обработчике события (например, в обработчике нажатия на кнопку Создать договор) размещается следующий код:

[php]
Процедура ПечатьДоговора()
Договор = ПолучитьМакет("МакетШаблонаWord");
// Получить объект из макета.
MSWord = Договор.Получить();

Попытка
Документ = MSWord.Application.Documents(1);
Документ.Activate();

//Определим имена
Организация = "ООО Шпаргалка"
ФИОДиректора = "Иванов Иван Иванович";
Заказчик = СокрЛП(Контрагент.НаименованиеПолное);
ФИОДиректораЗаказчика = "Васин Василий Васильевич";

//Получить объект, который будем использовать для поиска и замены.
Замена = Документ.Content.Find;

//Заменить заранее определенные ключевые конструкции на требуемый текст.
Замена.Execute("[Организация ]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик, 2);
Замена.Execute("[ФИОДиректора]", Ложь, Истина, Ложь, , , Истина, , Ложь, ФИОДиректора, 2);
Замена.Execute("[Заказчик]", Ложь, Истина, Ложь, , , Истина, , Ложь, Заказчик, 2);
Замена.Execute("[ФИОДиректораЗаказчика ]", Ложь, Истина, Ложь, , , Истина, , Ложь, ФИОДиректораЗаказчика, 2);

MSWord.Application.Visible = Истина;
MSWord.Activate();
Исключение
// Если произойдет ошибка, выводятся данные об ошибке и объект закрывается.
Сообщить(ОписаниеОшибки());
MSWord.Application.Quit();
КонецПопытки;

КонецПроцедуры
[/php]

Сортировка массива «Пузырьком»

Функция сортировки массива «МассивДляСортировки» по колонке «НомерСтроки»

Читать далее →